• Leetcode 105. 从前序与中序遍历序列构造二叉树


    地址 https://leetcode-cn.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/

    根据一棵树的前序遍历与中序遍历构造二叉树。
    
    注意:
    你可以假设树中没有重复的元素。
    
    例如,给出
    
    前序遍历 preorder = [3,9,20,15,7]
    中序遍历 inorder = [9,3,15,20,7]
    返回如下的二叉树:
    
        3
       / 
      9  20
        /  
       15   7
    

    解答

    同106 和剑指Offer 007. 重建二叉树 递归 类似
    利用前序遍历根节点是第一个
    中序遍历是根节点分割左右子树元素为两边 逐步分解问题到子问题

    class Solution {
    public:
    	TreeNode* dfs(vector<int>& preorder, int pl, int pr, vector<int>& inorder, int il, int ir) {
    		if (pr < pl) return NULL;
    		int rootval = preorder[pl];
    		int rootIdx = il;
    		for (rootIdx = il; rootIdx <= ir; rootIdx++) {
    			if (inorder[rootIdx] == rootval) { break; }
    		}
    
    		TreeNode* p = new TreeNode(rootval);
    
    		int inleft = rootIdx - il;
    		int inright = ir - rootIdx;
    
    		p->left = dfs(preorder, pl + 1, pl + inleft, inorder, il, il + inleft - 1);
    		p->right = dfs(preorder, pr - inright + 1, pr, inorder, ir - inright + 1, ir);
    
    		return p;
    	}
    
    	TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
    		return dfs(preorder, 0, preorder.size() - 1, inorder,0, inorder.size()-1);
    	}
    };
    

    我的视频题解空间

    作 者: itdef
    欢迎转帖 请保持文本完整并注明出处
    技术博客 http://www.cnblogs.com/itdef/
    B站算法视频题解
    https://space.bilibili.com/18508846
    qq 151435887
    gitee https://gitee.com/def/
    欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
    如果觉得不错,欢迎点赞,你的鼓励就是我的动力
    阿里打赏 微信打赏
  • 相关阅读:
    PHP的GD库
    PHP正则表达式
    Redis学习笔记
    C++的vector对象
    Python的with用法理解
    python 类属性与方法
    python lambda表达式
    Python3的decode()与encode()
    PHP的魔法方法__set() __get()
    MySQL的基本知识 -- 函数
  • 原文地址:https://www.cnblogs.com/itdef/p/14824735.html
Copyright © 2020-2023  润新知