当前位置: 首页 > article >正文

力扣105. 从前序与中序遍历序列构造二叉树

  • 思路:
    • 先序遍历:根、左子树、右子树;
    • 中序遍历:左子树、根、右子树;
    • 遍历先序遍历数组 prev,使用一个辅助栈缓存“根节点”;
    • 通过栈顶“根节点”与中序遍历数组 in 比较,确认是否到了“最左”节点;
      • 如果没有到最左节点,将 prev[idx] 节点挂到栈顶的左子树节点上,并且入栈;
      • 如果到了“最左”节点,出栈,直到不是“最左”节点,将节点挂到栈顶的右子树节点上;
/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        if (!preorder.size()) {
            return nullptr;
        }

        TreeNode* root = new TreeNode(preorder[0]);
        std::stack<TreeNode*> stk;
        stk.push(root);

        int in_idx = 0;
        for (int idx = 1; idx < preorder.size(); ++idx) {
            int pre_val = preorder[idx];
            TreeNode* node = stk.top();
            if (node->val != inorder[in_idx]) {
                node->left = new TreeNode(pre_val);
                stk.push(node->left);
            } else {
                while (!stk.empty() && (stk.top()->val == inorder[in_idx])) {
                    node = stk.top();
                    stk.pop();
                    ++in_idx;
                }

                node->right = new TreeNode(pre_val);
                stk.push(node->right);
            }
        }

        return root;
    }
};


http://www.kler.cn/a/149807.html

相关文章:

  • PaaS云原生:分布式集群中如何构建自动化压测工具
  • [项目代码] YOLOv5 铁路工人安全帽安全背心识别 [目标检测]
  • go T 泛型
  • 第16章 SELECT 底层执行原理
  • 面试题之---解释一下原型和原型链
  • 多媒体信息检索
  • 虹科方案 | 如何破解CAN与车载以太网之间数据传输和协议转换的难题?
  • 树与二叉树堆:链式二叉树的实现
  • 手机 IOS 软件 IPA 签名下载安装详情图文教程
  • 第七节HarmonyOS UIAbility生命周期以及启动模式
  • 基于SpringBoot的图书管理系统
  • <Linux>(极简关键、省时省力)《Linux操作系统原理分析之Linux 进程管理 7》(11)
  • AI算法中的模型量化岗是做什么的
  • 制作心理咨询小程序的详细指南
  • 开发定制化抖音票务小程序的技术解析
  • 技术分享| anyRTC之RTN网络
  • 解决苹果手机iphone手机强制重启
  • 6-4 jmu-python-发牌
  • Vue框架学习笔记——事件scroll和wheel的区别
  • C#中反射的使用总结
  • 后端整合Swagger+Knife4j接口文档
  • Redis-安装、配置和修改配置文件、以及在Ubuntu和CentOS上设置Redis服务的开机启动和防火墙设置,以及客户端连接。
  • 面试题库之JAVA基础篇(一)
  • springboot自动重启及SpringBoot Developer tools简介
  • 22-Python与设计模式--状态模式
  • 2023亚太地区数学建模B题思路分析+模型+代码+论文