剑指offer. 重建二叉树

Posted tingweichen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指offer. 重建二叉树相关的知识,希望对你有一定的参考价值。

输入一棵二叉树前序遍历和中序遍历的结果,请重建该二叉树。

注意:

二叉树中每个节点的值都互不相同;

输入的前序遍历和中序遍历一定合法;

样例
给定:
前序遍历是:[3, 9, 20, 15, 7]
中序遍历是:[9, 3, 15, 20, 7]

返回:[3, 9, 20, null, null, 15, 7, null, null, null, null]
返回的二叉树如下所示:
    3
   /   9  20
    /     15   7
 
想法:前序遍历是 根->左->右,中序遍历是左->中->右.先找到根节点,在根节点左边是左子树,右边是右子树。然后递归重建二叉树
/**
 * 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:
    map<int, int> pos;
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int n = inorder.size();
//将中序遍历的结果存放在hash表中,能够顺序读取
        for(int i = 0 ; i < n ; i++){
            pos[inorder[i]] = i;
        }
        return dfs(preorder, inorder, 0, n - 1, 0, n - 1);
    }
    TreeNode* dfs(vector<int>& pre, vector<int>& in, int pl, int pr, int il, int ir){
        if(pl > pr){
            return nullptr;
        }
//找到根节点
        auto root = new TreeNode(pre[pl]);
        //找到根节点对应的索引
        int k = pos[root->val];
//pl+1是前序遍历中左子树起始位置,结束位置是k-il+pl,中序遍历左子树起始点是il,终止位置是k-1
        auto left = dfs(pre, in ,pl+1, pl + k-il,il,k-1);
//pl+k-il+1是前序遍历中左序子树的起始点,结束位置是pr,,中序遍历右子树起始点是k+1,终止位置是ir
        auto right = dfs(pre ,in, pl + k - il + 1, pr, k+1, ir);
        root->left = left;
        root->right = right;
        return root;
        
    }

};

以上是关于剑指offer. 重建二叉树的主要内容,如果未能解决你的问题,请参考以下文章

剑指offer重建二叉树python

剑指offer重建二叉树

《剑指offer》— JavaScript重建二叉树

剑指 Offer 07. 重建二叉树(java解题)

剑指Offer07 重建二叉树

重建二叉树-剑指Offer