剑指 Offer ------- 重建二叉树

在这里插入图片描述

题目链接!

思路:
这道题的话,我们只需要知道二叉树的遍历特点即可,前序数组的第一个数字就是我们要建立的第一个根节点的值,那么我们就需要在中序数组上遍历得到左右子树的划分,我们知道中序是LDR,所以在根节点x的左边一定是左子树,周而复始递归即可。

代码:

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
    
    
public:
	//当然,这道题也可以换成  判断能否构成二叉树
    TreeNode* dfs(vector<int>& t1,int left1,int right1,vector<int>& t2,int left2,int right2){
    
    
        if(left1>right1) return NULL;
        int rt = t1[left1]; 
        TreeNode* root = new TreeNode(rt);
        if(right1==left1) return root;

        int i=0;
        for( i=left2;i<=right2;++i){
    
    
        }
        root->left = dfs(t1,left1+1,left1+(i-left2),t2,left2,i-1);
        root->right = dfs(t1,left1+(i-left2)+1,right1,t2,i+1,right2);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    
    
        if(preorder.size()==0 || inorder.size()==0) return NULL;
        //这里我们要left,right来表示下标,好操作
        return dfs(preorder,0,preorder.size()-1,inorder,0,inorder.size()-1);
    }
};

猜你喜欢

转载自blog.csdn.net/weixin_43743711/article/details/115065745
今日推荐