zoukankan      html  css  js  c++  java
  • leetcode 从前序与中序遍历构造一颗二叉树 深搜

    根据一棵树的前序遍历与中序遍历构造二叉树。

    注意:
    你可以假设树中没有重复的元素。

    例如,给出

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

    3
    /
    9 20
    /
    15 7

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal
    思路:前序遍历是根左右,中序遍历是左中右,那麽在每次在前序遍历里面找到根节点,然后再一步步缩小范围找到每一个根节点(递归实现

    class Solution {
    public:
        unordered_map<int,int> pos;//目的是快速找到一个值在inorder内的下标
        TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
            int n=preorder.size();
            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 NULL;//进行到找不到结点的时候就返回
            int len=pos[pre[pl]]-il;
            auto root = new TreeNode(pre[pl]);
            root->left=dfs(pre,in,pl+1,pl+len,il,il+len-1);
            root->right=dfs(pre,in,pl+len+1,pr,il+len+1,ir);
            return root;
        }
    };
    
  • 相关阅读:
    减治算法之寻找第K小元素问题
    OpenGL的版本号历史和发展
    动态注冊监听
    Thinking in Java -- 类型信息RTTI
    Unity3D
    Oracle改动字段类型
    函数定义
    foreach
    数组
    结构体
  • 原文地址:https://www.cnblogs.com/clear-love/p/11291815.html
Copyright © 2011-2022 走看看