算法札记——4.26

记录一道今天做的一道比较有意思的二叉树的算法题,对于二叉树的概念可以看这篇博文:数据结构---树与二叉树的基本概念-CSDN博客

以下是该题的链接:105. 从前序与中序遍历序列构造二叉树 - 力扣(LeetCode)​​​​​​

据题意所知,我们要通过二叉树的前序与中序遍历的数组来构建二叉树,初看题目着实无从下手。但是让我们回想以下前序与中序遍历的相关代码与过程。前序遍历是先访问当前节点,在先后向左右子数递归,所以前序遍历是先访问根节点,在访问左右子树 ;中序遍历则是先向左子树递归,在中间访问当前节点,最后再先右子树递归,所以中序遍历是先访问完左子树,再访问根节点,最后访问右子树

根据以上思考,我们可以看出:前序可确定根,后序能确定左右子树。

然后就是将上述思想运用与代码中来解决问题了:最开始,preoderder的首位置一定是整棵树的根节点,先在preorder数组选定首位置(i = 0)为根节点,然后在inorder中找到相同数字(题目规则:二叉树中的节点值各不相同)的下标 j,此时便可以以该位置来切分左右子树,分别为0 (begin), j - 1j + 1, n - 1 (end)。创建根节点,然后分别向左右子树begin, j - 1j + 1, end范围递归(i使用引用,每次在preorder数组中都会指向当前子树的根节点),并分别返回左右子树来构建整个树。

以下是相关代码实现:

cpp 复制代码
class Solution {
    TreeNode* _buildTree(vector<int>& preorder, vector<int>& inorder, int& i, int begin, int end) 
    {
        if (begin > end)
            return nullptr;
        
        /*
        preorder确定根节点,inorder确定左右子树
        begin与end确定以当前节点为根节点的所有子树在inorder之中的范围
        */
        int j = begin;
        while (preorder[i] != inorder[j])
            ++j;
        TreeNode* root = new TreeNode(preorder[i++]);
        root->left = _buildTree(preorder, inorder, i, begin, j - 1);
        root->right = _buildTree(preorder, inorder, i, j + 1, end);

        return root;
    }
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        int i = 0;
        return _buildTree(preorder, inorder, i, 0, preorder.size() - 1);
    }
};
相关推荐
爱刷碗的苏泓舒1 小时前
PPP-AR 中的参考星选取:数学原理、评价指标与切换处理
算法·gnss·模糊度固定·ppp-ar·星间单差·参考星·卫星端偏差
烬羽4 小时前
递归老写崩?一个"退回"公式,把回溯题变成填空题
javascript·深度学习·算法
闪电悠米4 小时前
力扣hot100-41.缺失的第一个正数-原地哈希详解
数据结构·算法·哈希算法
星空露珠5 小时前
28种颜色对应名称,
开发语言·数据库·算法·游戏·lua
QXWZ_IA7 小时前
桥梁数字孪生怎么落地?
人工智能·科技·算法·智能硬件·政务
Kel7 小时前
输出层与反分词(Output Layer & Detokenization)
人工智能·算法·架构
陕西企来客7 小时前
2026年7月技术好GEO优化方案:算法适配与内容策略
人工智能·算法·机器学习·技术好geo优化
风栖柳白杨7 小时前
【面试】AI算法工程师_空白自测版本
人工智能·算法·面试
闪电悠米8 小时前
力扣hot100-73.矩阵置零-标记数组详解
算法·leetcode·矩阵
栋***t9 小时前
从“纸质试卷”到“AI智能组卷”,麦塔在线考试系统如何重构出题逻辑?
java·大数据·人工智能·算法·重构