1、根据前序和后序构建二叉树
思路:在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。
但在中序遍历序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的值得左边,而右子树的节点的值位于根节点的值的左边。所以需要扫描中序遍历,才能找到根节点的值。既然已经分别找到了左、右子树的前序序列和中序遍历,我们可以用同样的方法去构建左右子树。我们可以用递归实现:
struct TreeNode* Buynode()
{
struct TreeNode* s = (struct Treenode*)malloc(sizeof(struct TreeNode));
if(NULL == s)
exit(1);
memset(s,0,sizeof(struct TreeNode));
return s;
}
int FindIndex(const ElemType *istr, int n, ElemType x)
{
int pos = -1;
for(int i = 0;i < n;i++)
{
if(istr[i] == x)
{
pos = i;
break;
}
}
return pos;
}
struct BtNode* CreatePI(const ElemType *pstr, const ElemType *istr, int n)
{
struct BtNode *s = NULL;
if(n > 0)
{
s = Buynode();
s->data = *pstr;
int pos = FindIndex(istr, n, *pstr);
s->leftchild = CreatePI(pstr+1,istr,pos);
s->rightchild = CreatePI(pstr+1+pos,istr+1+pos,n-pos-1);
}
return s;
}
struct BtNode* CreateTreePI(const ElemType *pstr,const ElenType *istr, int n)
{
if(NULL == pstr || NULL == istr || n < 1)
return NULL;
return CreatePI(pstr,istr,n);
}
int main()
{
char *pstr = "ABCDEFGH";
char *istr = "CBEDFAGH";
char *lstr = "CEFDBHGA";
BinaryTree root = NULL;
int n = strlen(pstr);
root = CreateTreePI(pstr,istr,n);
}
2、根据中序和后序构建二叉树
思路:我们根据后序遍历的特点可以知道后序遍历的最后一个结点就是根节点。这样就可以再根据中序遍历的特点构建出二叉树。
代码实现:
struct TreeNode* Buynode()
{
struct TreeNode* s = (struct Treenode*)malloc(sizeof(struct TreeNode));
if(NULL == s)
exit(1);
memset(s,0,sizeof(struct TreeNode));
return s;
}
int FindIndex(const ElemType *istr, int n, ElemType x)
{
int pos = -1;
for(int i = 0;i < n;i++)
{
if(istr[i] == x)
{
pos = i;
break;
}
}
return pos;
}
struct BtNode* CreateIL(const ElemType *istr, const ElemType *lstr, int n)
{
struct BtNode *s = NULL;
if(n > 0)
{
s = Buynode();
s->data = *pstr;
int pos = FindIndex(istr, n, *lstr[n-1]);
s->leftchild = CreatePI(istr,lstr,pos);
s->rightchild = CreatePI(istr+1+pos,lstr+pos,n-pos-1);
}
return s;
}
struct BtNode* CreateTreeIL(const ElemType *istr,const ElenType *lstr, int n)
{
if(NULL == lstr || NULL == istr || n < 1)
return NULL;
return CreateIL(istr,lstr,n);
}
int main()
{
char *pstr = "ABCDEFGH";
char *istr = "CBEDFAGH";
char *lstr = "CEFDBHGA";
BinaryTree root = NULL;
int n = strlen(pstr);
root = CreateTreePI(pstr,istr,n);
root = CreateTreePI(istr,lstr,n);
return 0;
}