【剑指Offer07-重建二叉树】

题目:
在这里插入图片描述
这题其实和建立二叉树挂钩。平时有用递归建立过排序二叉树和平衡二叉树,所以理解上倒是不难。

唯一比较困难点的地方在于分割这个序列和递归传入参数的处理。

其它的就比较中规中矩。

C++代码附带测试:

#include<iostream>
#include<vector>
#include<unordered_map>

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


class Solution {
public:
	unordered_map<int,int> index;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
		int n = preorder.size();
		for(int i=0;i<n;i++){
			index[inorder[i]] = i;
		}
		
		return myBuildTree(preorder,inorder,0,n-1,0,n-1);
		//i的位置划分左右子树 
    }
    
    
    TreeNode* myBuildTree(vector<int>& preorder,vector<int>& inorder,int inorder_left,int inorder_right,int preorder_left,int preorder_right){
    	if (preorder_left > preorder_right) {
            return nullptr;
        }
    	int preorder_root = preorder_left;
    	int inorder_root = index[preorder[preorder_root]];//得到各自序列中的根节点
		
		TreeNode* root = new TreeNode(preorder[preorder_root]);//先构建这个根节点
		//左子树序列
		int size_left = inorder_root - inorder_left;
		
		//递归建立整个子树
		root->left = myBuildTree(preorder,inorder,inorder_left,inorder_root-1,preorder_left+1,preorder_left+size_left);
		
		root->right = myBuildTree(preorder,inorder,inorder_root+1,inorder_right,preorder_left+size_left+1,preorder_right);
		
		return root;
	}
	
};

void preorder1(TreeNode* root){
	if(root==nullptr){
		return;
	}
	cout<<root->val<<" ";
	preorder1(root->left);
	preorder1(root->right);
}

int main(){
	vector<int> preorder = {3,9,20,15,7};
	vector<int> inorder = {9,3,15,20,7};
	Solution solution;
	TreeNode* root  = solution.buildTree(preorder,inorder);
	preorder1(root);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值