由中序与后序遍历得到二叉树

例子
3 2 1 4 5 7 6 (中序遍历) 
3 1 2 5 6 7 4 (后序遍历)
思路
整体来说就是一个递归分治的思想
重点在后序遍历上,由后序遍历的定义知,后序遍历的最后一项肯定为根结点,然后在中序遍历中找到这一项(假设无重复项)
如:由 3 1 2 5 6 7 4 (后序遍历)知该二叉树的根结点为4,因此将3 2 1 4 5 7 6 (中序遍历) 分割为3 2 1||4||5 7 6,
又由中序遍历的定义知,4左边的为左子树,右边的为右子树。在将每颗子树看为一颗树
------左:3 2 1(中序遍历) 3 1 2(后序遍历)--------右:5 7 6 (中序遍历)  5 6 7(后序遍历)-------

以此类推。。。。直到不可分割出现递归出口。


vector<int>inorder;
vector<int>postorder;
struct my_Node
{
	int data;
	struct my_Node *left_p;
	struct my_Node *right_p;
};

struct my_Node* create_tree(int start_inorder, int end_inorder, int start_postorder, int end_postorder)
//传入的四个参数为,中序遍历的开始与结束位,后序遍历的开始与结束位
{
	my_Node* root = (my_Node*)malloc(sizeof(my_Node));
	root->data = postorder[end_postorder];
	if (end_inorder - start_inorder < 2)//递归出口,子树为空
	{
		root->left_p = NULL;
		root->right_p = NULL;
		return root;
	}

	//找出中序遍历中的根结点
	int p_temp = start_inorder;
	while ((p_temp<=end_inorder)&&(inorder[p_temp]!=postorder[end_postorder]))
	{
		p_temp++;
	}

	//左子树
	int num_left_tree = p_temp - start_inorder;//左子树大小
	if (num_left_tree!=0)
	{
		root->left_p = create_tree(start_inorder, p_temp-1, start_postorder, start_postorder + (num_left_tree)-1);
	}
	else
	{
		root->left_p = NULL;
	}
	//右子树
	int num_right_tree = end_inorder - p_temp;
	if (num_right_tree!=0)
	{
		root->right_p = create_tree(p_temp + 1, end_inorder, end_postorder - num_right_tree, end_postorder - 1);
	}
	else
	{
		root->right_p = NULL;
	}
	return root;
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值