根据遍历结果构造二叉树

来源:互联网 发布:上海大学乐乎论坛 编辑:程序博客网 时间:2024/05/29 13:02

二叉树的前序,中序,后序遍历不是本篇说的重点,这次主要说一下如何根据两种遍历结果构造一棵树。

 

1.根据前序和中序遍历的结果构造这棵树

char *ps = "ABCDEFGH";   //前序

char *is = "CBEDFAGH";    //中序

由前序遍历的规则可知,ps的第一个元素即为树的根,我们以第一个为界限在中序遍历的结果里面找,即可将第二个数组划分为两部分,左边为这棵树的左子树,右边为这棵树的右子树。后面的过程同上。下面是代码实现。

BtNode * CreateTreePI(ElemType *ps,ElemType *is,int n)

{

BtNode *s = NULL;

if(n > 0)

{

s = _Buynode();                                  

s->data = ps[0];

int pos = findis(is,ps[0],n);     //寻找树根的位置

if(pos == -1) exit(1);

s->leftchild = CreateTreePI(ps+1,is,pos);    //注意边界

s->rightchild = CreateTreePI(ps+pos+1,is+pos+1,n-pos-1);

}

return s;

}

 

//寻找树根在中序遍历的位置函数

int findis(ElemType *is,ElemType x,int n)

{

for(int i = 0;i<n;++i)

{

if(is[i] == x) 

return i;

}

return -1;

}

 

2.根据中序和后序的结果构造这棵树

后序遍历的最后一个元素为树的根,以最后一个元素为界限将中序遍历的结果划分为两部分,左边的为左子树,右边的为右子树。以下是代码实现:

BtNode * CreateTreeIL(ElemType *is,ElemType *ls,int n)

{

BtNode *s = NULL;

If(n>0)

{

S = _BuyNode();

S->data = ls[n-1];

Int pos = findIs(is,ls[n-1],n);

If(pos==-1)exit(-1);

S->leftchild = CreateTreeIL(is,ls,pos);

S->rightchild = CreateTreeIL(is+pos+1,ls+pos,n-pos-1);

}

return s;

}

0 0