看剑指offer的时候看到这个题就写了一下代码,分享一下:
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。
解题思路:在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。在中序遍历序列中,根节点的值在序列的中间,左子树的节点的值位于根节点的左边,而右子树的结点的值位于根结点的值的右边。因此我们需要扫描中序遍历序列,才能找到根节点的值。
typedef struct BtNode
{
char data;
BtNode * leftchild;//左孩子节点
BtNode * rightchild;//右孩子节点
}BtNode,BtTree;
BtNode *BuyNode()//购买结点
{
BtNode *s = (BtNode *)malloc(sizeof(BtNode));
assert(s != NULL);
memset(s,0,sizeof(BtNode));
}
int Find(char *str,char x,int len)//查找函数,返回对应的下标
{
if(str == NULL || len < 0)
return -1;
for(int i = 0; i<len; i++)
{
if(str[i] == x)
return i;
}
return -1;
}
BtNode * CreateTreePI(char *pi,char *is,int len)//已知前序和中序创建树
{
BtNode *s = NULL;
if(pi != NULL && is != NULL && len > 0)
{
s = BuyNode();
s->data = pi[0];
int pos = Find(is,pi[0],len);
if(pos == -1)
exit(0);
s->leftchild = CreateTreePI(pi+1,is,pos);
s->rightchild = CreateTreePI(pi+pos+1,is+pos+1,len-pos-1);
}
return s;
}
扩展:已知中序和后序遍历,构建一颗二叉树
思路:在二叉树的后序遍历序列中,最后一个数字总是树的根节点的值。所以与上述实现非常相似。整体解决见如下代码:
BtNode* CreateTreeIL(char *is,char *ps,int len)//已知中序和后序创建树
{
BtNode *s = NULL;
if(is != NULL && ps != NULL && len > 0)
{
s = BuyNode();
s->data = ps[len - 1];
int pos = Find(is,ps[len-1],len);
if(pos == -1)
exit(0);
s->leftchild = CreateTreeIL(is,ps,pos);
s->rightchild = CreateTreeIL(is+pos+1,ps+pos,len-pos-1);
}
return s;
}