首页 > 其他 > 详细

重建二叉树

时间:2021-05-09 11:26:26      阅读:34      评论:0      收藏:0      [点我收藏+]

输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

 

例如,给出

前序遍历 preorder = [3,9,20,15,7]
中序遍历 inorder = [9,3,15,20,7]
返回如下的二叉树:

3
/ \
9 20
/ \
15 7

#include "vector"
#include "iostream"


using namespace std;

struct TreeNode {
    int val;
    TreeNode *left;
    TreeNode *right;

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

class Solution {
public:
    TreeNode *buildTree(vector<int> &preorder, vector<int> &inorder) {
        int length = preorder.size();
        if (length == 0)
            return nullptr;
        int rootValue = preorder[0];
        TreeNode *node = new TreeNode(rootValue);
        int lfEnd;
        for (lfEnd = 0; inorder[lfEnd] != rootValue; ++lfEnd);

        if (lfEnd == 0)
            node->left = nullptr;
        else {
            vector<int> prelf(preorder.begin() + 1, preorder.begin() + 1 + lfEnd);
            vector<int> inlf(inorder.begin(), inorder.begin() + lfEnd);
            node->left = buildTree(prelf, inlf);
        }
        if (length - 1 == lfEnd)
            node->right = nullptr;
        else {
            vector<int> prerg(preorder.begin() + lfEnd + 1, preorder.end());
            vector<int> inrg(inorder.begin() + lfEnd + 1, inorder.end());
            node->right = buildTree(prerg, inrg);
        }

        return node;
    }
};

int main() {
    Solution s;
    vector<int> pre{3, 9, 20, 15, 7};
    vector<int> in{9, 3, 15, 20, 7};
    s.buildTree(pre, in);
}

 

重建二叉树

原文:https://www.cnblogs.com/zhangzhangtabszj/p/14747230.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!