• 剑指 Offer 03. 重建二叉树


    剑指 Offer 03. 重建二叉树

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

    分析:

    前序遍历的顺序为:根左右 中序遍历的顺序为:左根右

    递归思想:

    1. 我们先根据前序遍历序列的第一个确定根,然后在中序遍历的序列中找到根的位置,根左边的就是其左子树,右边就是其右子树
    2. 构建根和左右子树
    3. 递归的进行1和2

    方法1:

    func reConstructBinaryTree(pre []int, in []int) *TreeNode {
        if len(pre) != len(in) || len(pre) == 0 { 
            return nil 
        }
        // find root and root Index in inOrder
        rootVal := pre[0]
        rootIndex := 0
        for i := 0; i < len(in); i++ {
            if in[i] == rootVal {
                rootIndex = i
            }
        }
        // pre and in for left and right 
        inL, inR := in[:rootIndex], in[rootIndex+1:]
        preL, preR := pre[1:rootIndex+1], pre[rootIndex+1:]
        // revursive
        left := reConstructBinaryTree(preL, inL)
        right := reConstructBinaryTree(preR, inR)
        return &TreeNode{Val: rootVal, Left: left, Right: right}
    }

    方法2:

    class Solution {
    public:
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
            if (!preorder.size()) {
                return nullptr;
            }
            TreeNode* root = new TreeNode(preorder[0]);
            stack<TreeNode*> stk;
            stk.push(root);
            int inorderIndex = 0;
            for (int i = 1; i < preorder.size(); ++i) {
                int preorderVal = preorder[i];
                TreeNode* node = stk.top();
                if (node->val != inorder[inorderIndex]) {
                    node->left = new TreeNode(preorderVal);
                    stk.push(node->left);
                }
                else {
                    while (!stk.empty() && stk.top()->val == inorder[inorderIndex]) {
                        node = stk.top();
                        stk.pop();
                        ++inorderIndex;
                    }
                    node->right = new TreeNode(preorderVal);
                    stk.push(node->right);
                }
            }
            return root;
        }
    };
  • 相关阅读:
    uniapp升级中心 uniupgradecenter踩坑
    uniapp的webview嵌入网页,网页与uniapp通信
    【JS】实现点击图标播放音乐
    你知道 lorem ipsum 是什么吗?
    【CSS】实现折扇效果
    【CSS】使用CSS实现正方体并旋转
    解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件
    css逐帧动画
    【CSS】使用渐变画一个太极图案
    WebStorm设置px转换rem插件
  • 原文地址:https://www.cnblogs.com/dingxiaoqiang/p/14629422.html
Copyright © 2020-2023  润新知