leetcode<105. 从前序与中序遍历序列构造二叉树><106. 从中序与后序遍历序列构造二叉树>

简介: 二叉树编程题解析

image.png

传送门:105. 从前序与中序遍历序列构造二叉树

给定一个二叉树的前序中序遍历,要求根据两个顺序构建一棵二叉树。对前中序遍历不够熟悉的同学可能会比较疑惑,甚至不知道该如何下手。前序遍历则是以根节点左节点右节点的顺序进行遍历,而中序遍历则是以左节点根节点右节点的顺序进行遍历。于是前序遍历的第一个节点便是这棵树的根节点,我们在中序遍历之中找这个节点的位置,此时在节点左边的节点都是根节点的左子树,右边的都是其右子树。

根据这个规律我们可以顺着前序遍历,不断排除已用过节点,将每次的范围抽象成一个个区间。每次都找到这个根的左子树和右子树,并将其连接起来。便完成树的构造。

TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder,int begin,int end,int& root)
    {
        if(begin>end) return nullptr;                       //区间内没有节点了就返回
        TreeNode* newnode = new TreeNode(preorder[root]);  //创建当前节点
        //在找中序中找位置
        int i;
        for(i = begin;i<=end;i++)
        {
            if(inorder[i] == preorder[root]) break;
        }
        root++; //标记位
        //将原数组分成三个部分 begin~i-1 ,i ,i+1~end
        newnode->left = _buildTree(preorder,inorder,begin,i-1,root); //连接左子树
        newnode->right = _buildTree(preorder,inorder,i+1,end,root);  //连接右子树
        return newnode;       //返回构建完的树
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int i = 0;            //以引用的方式记录节点的下标,因为每次找的都是不同的节点
        return _buildTree(preorder, inorder,0,preorder.size()-1,i);
    }

image.gif

image.png

传送门:106. 从中序与后序遍历序列构造二叉树

这题与上面一题本质上是一样的,但是在后序遍历中根节点为最后一位,因此要从后序遍历的最后一位开始遍历。不仅如此根节点的上一位并不是左节点而是右节点,因此在连接的时候必须要先连接右节点再连接左节点。

TreeNode* _buildTree(vector<int>& inorder, vector<int>& postorder,int& root,int begin,int end)
    {
        if(begin>end) return nullptr;  //区间内没数则返回
        TreeNode* newnode = new TreeNode(postorder[root]);
        int i;
        for(i = begin;i<=end;i++)       //找当前节点在中序遍历中的位置
        {
            if(inorder[i]==postorder[root]) break;
        }
        //分割区间
        // begin~i-1, i , i+1~end
        root--;    //向前遍历
        newnode->right = _buildTree(inorder,postorder,root,i+1,end); //连接右节点
        newnode->left = _buildTree(inorder,postorder,root,begin,i-1); //连接左节点
        return newnode;    //返回构造好的节点
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        int i = postorder.size()-1;  //从末尾开始遍历
        return _buildTree(inorder,postorder,i,0,postorder.size()-1);
    }

image.gif

目录
相关文章
|
4月前
|
Go
【LeetCode 热题100】DP 实战进阶:最长递增子序列、乘积最大子数组、分割等和子集(力扣300 / 152/ 416 )(Go语言版)
本文深入解析三道经典的动态规划问题:**最长递增子序列(LIS)**、**乘积最大子数组** 和 **分割等和子集**。 - **300. LIS** 通过 `dp[i]` 表示以第 `i` 个元素结尾的最长递增子序列长度,支持 O(n²) 动态规划与 O(n log n) 的二分优化。 - **152. 乘积最大子数组** 利用正负数特性,同时维护最大值与最小值的状态转移方程。 - **416. 分割等和子集** 转化为 0-1 背包问题,通过布尔型 DP 实现子集和判断。 总结对比了三题的状态定义与解法技巧,并延伸至相关变种问题,助你掌握动态规划的核心思想与灵活应用!
141 1
|
5月前
|
Go 开发者 索引
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣33 / 81/ 153/154)(Go语言版)
本文深入探讨了LeetCode中四道关于「搜索旋转排序数组」的经典题目,涵盖了无重复和有重复元素的情况。通过二分查找的变形应用,文章详细解析了每道题的解题思路和Go语言实现代码。关键点包括判断有序区间、处理重复元素以及如何缩小搜索范围。文章还总结了各题的异同,并推荐了类似题目,帮助读者全面掌握二分查找在旋转数组中的应用。无论是初学者还是有经验的开发者,都能从中获得实用的解题技巧和代码实现方法。
258 14
|
6月前
|
Go
【LeetCode 热题100】路径与祖先:二叉树中的深度追踪技巧(力扣437 / 236 )(Go语言版)
本文深入探讨二叉树中路径与祖先问题,涵盖两道经典题目:LeetCode 437(路径总和 III)和236(最近公共祖先)。对于路径总和 III,文章分析了双递归暴力解法与前缀和优化方法,后者通过哈希表记录路径和,将时间复杂度从O(n²)降至O(n)。在最近公共祖先问题中,采用后序遍历递归查找,利用“自底向上”的思路确定最近公共祖先节点。文中详细解析代码实现与核心要点,帮助读者掌握深度追踪技巧,理解树结构中路径与节点关系的本质。这类问题在面试中高频出现,掌握其解法意义重大。
127 4
|
6月前
|
算法 Go
【LeetCode 热题100】深入理解二叉树结构变化与路径特性(力扣104 / 226 / 114 / 543)(Go语言版)
本博客深入探讨二叉树的深度计算、结构变换与路径分析,涵盖四道经典题目:104(最大深度)、226(翻转二叉树)、114(展开为链表)和543(二叉树直径)。通过递归与遍历策略(前序、后序等),解析每题的核心思路与实现方法。结合代码示例(Go语言),帮助读者掌握二叉树相关算法的精髓。下一讲将聚焦二叉树构造问题,欢迎持续关注!
141 10
|
6月前
|
存储 算法 数据可视化
【二叉树遍历入门:从中序遍历到层序与右视图】【LeetCode 热题100】94:二叉树的中序遍历、102:二叉树的层序遍历、199:二叉树的右视图(详细解析)(Go语言版)
本文详细解析了二叉树的三种经典遍历方式:中序遍历(94题)、层序遍历(102题)和右视图(199题)。通过递归与迭代实现中序遍历,深入理解深度优先搜索(DFS);借助队列完成层序遍历和右视图,掌握广度优先搜索(BFS)。文章对比DFS与BFS的思维方式,总结不同遍历的应用场景,为后续构造树结构奠定基础。
270 10
|
6月前
|
Go 索引 Perl
【LeetCode 热题100】【二叉树构造题精讲:前序 + 中序建树 & 有序数组构造 BST】(详细解析)(Go语言版)
本文详细解析了二叉树构造的两类经典问题:通过前序与中序遍历重建二叉树(LeetCode 105),以及将有序数组转化为平衡二叉搜索树(BST,LeetCode 108)。文章从核心思路、递归解法到实现细节逐一拆解,强调通过索引控制子树范围以优化性能,并对比两题的不同构造逻辑。最后总结通用构造套路,提供进阶思考方向,帮助彻底掌握二叉树构造类题目。
284 9
|
12月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
75 2
|
12月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
83 2
|
12月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
57 2
|
存储 算法
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题
文章深入探讨了二叉树的层序遍历方法,并展示了如何通过队列实现层序遍历的算法逻辑,同时指出掌握层序遍历技巧可以帮助解决LeetCode上的多道相关题目。
二叉树进阶-学会层序遍历助你一次刷完leetcode10道题

热门文章

最新文章