zoukankan      html  css  js  c++  java
  • LeetCode 剑指Offer 007. 重建二叉树 递归

    地址 https://leetcode-cn.com/problems/zhong-jian-er-cha-shu-lcof/

    输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。
    
    例如,给出
    
    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:
    
        3
       / 
      9  20
        /  
       15   7
     
    
    限制:
    
    0 <= 节点个数 <= 5000
    

    解答 

    算法1
    利用前序遍历根节点是第一个
    中序遍历是根节点分割左右子树元素为两边 逐步分解问题到子问题

    class Solution {
    public:
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder, int prel, int prer, int inl, int inr)
        {
            //判断范围是否可行
            if (prel > prer) return NULL;
    
            int rootVal = preorder[prel];
            TreeNode* root = new TreeNode(rootVal);
            //在中序中寻找根节点 得到左子树和右子树的元素数目
            int i = inl;
            for (i = inl; i <= inr; i++) {
                if (inorder[i] == rootVal) break;
            }
            int count = i - inl;
            root->left = buildTree(preorder, inorder, prel + 1, prel + count, inl, inl + count - 1);
            root->right = buildTree(preorder, inorder, prel + count + 1, prer, inl + count + 1, inr);
    
            return root;
        }
    
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
            int r = inorder.size() - 1;
            return buildTree(preorder, inorder, 0, r, 0, r);
        }
    };
  • 相关阅读:
    python学习-dict
    python学习
    pycharm 2017版Mac激活码
    Day6_python基础知识<模块学习>
    having 子句
    数据库实例指定
    EXCEL里面单元格内容太多显示不全应该怎么弄。
    你没有权限在此位置保存文件_请与管理员联系的问题解决
    FQ软件
    C#高级编程(中文第七版)
  • 原文地址:https://www.cnblogs.com/itdef/p/14233161.html
Copyright © 2011-2022 走看看