读书人

给出树的所有结点(无序)怎么构建起

发布时间: 2012-02-06 15:52:45 作者: rapoo

给出树的所有结点(无序),如何构建起一棵二叉树?
节点之间可以判断出是不是父子关系,不是父子关系就认为是兄弟关系。

构建树时按照左孩子,右兄弟的方式

所有节点放在一具集合里,无序,已知树的根节点,要求把其它节点安插到二叉树里

[解决办法]
我也是学数据结构的学生,我觉得在建立二叉树时,结点实际必须有个默认的排序方式,我们学的是“扩展先序遍历序列”建立二叉树,不适合您的要求。您可以用“完全二叉树层次遍历序列”建立二叉树。

/*完全二叉采用 顺序存储结构 较为方便*/
#define MaxSize 100
typedef struct tree /*声明树的结构*/
{
tree *left; /*存放左子树的指针*/
tree *right; /*存放右子树的指针*/
char data; /*存放节点的内容*/
} treenode, * b_tree; /*声明二叉树的链表*/

b_tree Q[MaxSize]; /*使用数组存储完全二叉树*/

/*建立二叉树,按完全二叉树的层次遍历序列输入*/
void createbtree(b_tree root)
{
char ch;
int front,rear;
b_tree s;
front=1;rear=0;
ch=getchar();
getchar();
while(ch!='#') /*输入'#'创建*/
{
s=NULL;
if(ch!='.') /*结点间用'.'隔开*/
{
s=(b_tree)malloc(sizeof(treenode));
s->data=ch;
s->left=NULL;
s->right=NULL;
}
rear++;
Q[rear]=s;
if(rear==1)
root=s;
else
{
if(s&&Q[front])
if(rear%2==0)
Q[front]->left=s;
else
Q[front]->right=s;
if(rear%2==1)
front++;
}
ch=getchar();
getchar();
}
}

此代码仅作参考,本人还是学生,有错误之处还请谅解,希望能对您能有所帮助!
[解决办法]
初始状态二叉树只有根节点,
每次从集合中取出一个元素A,用两个指针q、p 遍历二叉树,q指向父亲结点,p指向当前结点,判断p跟A的关系,兄弟则A作为q的孩子,孩子关系则A作为p的孩子,
重复上面的过程直到集合为空。
[解决办法]
既然能判断父子关系及知道根节点,那就一层层的填充树就行了,直到集合为空。

读书人网 >软件架构设计

热点推荐