二叉树遍历

前序遍历和中序遍历还原二叉树
思想如下:

    a、根据前序遍历结果,第一个元素为二叉树的根结点;

    b、观察中序遍历结果,根结点左侧的为左子树,若左子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;根结点右侧的为右子树,若右子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;

    c、上面的过程是递归的。先找到当前树的根结点,然后划分为左右子树,再进入左子树重复上面的过程,最后进入右子树重复上面的过程,最终还原一棵树。

1、前序遍历:GDAFEMHZ

      中序遍历:ADEFGHMZ

    求得后序遍历结果为:AEFDHZMG

2序遍历:ADCEFGHB

      中序遍历:CDFEGHAB

    求得后序遍历结果为:CFHGEDBA

中序遍历和后序遍历还原二叉树

思想如下:

    a、根据后序遍历结果,最后一个元素为二叉树的根结点;

    b、观察中序遍历结果,其中根结点左侧为左子树,若左子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;其中根结点右侧为右子树,若右子树根结点前(后)再无任何元素,则左(右)子树的左分支为空;

    c、上面的过程是递归的。先根据后序遍历结果找根结点,根结点左侧为左子树,右侧为右子树,再进入左子树重复上面的过程,最后进入右子树重复上面的过程,最终还原一棵树。

中序遍历:HDIBJEKALFMCNGO

后序遍历:HIDJKEBLMFNOGCA

前序遍历:ABDHIEJKCFLMGNO

struct TreeNode {
	int val;
    TreeNode *left;
    TreeNode *right;
	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
	
	int temp;
	int flag = 0;
	vector<int> preleft,vinleft;
	vector<int> preright,vinright;
	
	if(pre.empty() || vin.empty())
	{
		return NULL;
	}
	temp = pre[0];
	TreeNode *root = new TreeNode(temp);
	for(int j=0;j<vin.size();j++)
	{
		if(flag == 0)
		{
			if(vin[j] != temp)
			{
				vinleft.push_back(vin[j]);
				preleft.push_back(pre[j+1]);
			}
			else
				flag = 1;
		}
		else
		{
			vinright.push_back(vin[j]);
			preright.push_back(pre[j]);
		}
	}
	root->left = reConstructBinaryTree(preleft,vinleft);
	root->right = reConstructBinaryTree(preright,vinright);
	
	return root;
	
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值