已知先序和中序重建二叉树

看剑指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;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值