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

力扣106. 从中序与后序遍历序列构造二叉树

  • 思路:
    • 思路与 力扣105. 从前序与中序遍历序列构造二叉树 相同;
    • 差异的地方:
      • 从后序遍历数组尾部向前遍历;(根节点在尾部)
      • 一直迭代“最右”节点,将其挂载到栈顶(“根”节点)的右子树节点;(后序遍历从尾部迭代顺序变成了:根-右子树-左子树)
      • 出栈后,挂载左子树;
/**
 * 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>& inorder, vector<int>& postorder) {
        if (!postorder.size()) {
            return nullptr;
        }

        int post_size = postorder.size();

        std::stack<TreeNode*> stk;
        TreeNode* root = new TreeNode(postorder[post_size - 1]);
        stk.push(root);

        int in_idx = post_size - 1;
        for (int idx = post_size - 2; idx >= 0; --idx) {
            TreeNode *node = stk.top();
            int post_val = postorder[idx];

            if (node->val != inorder[in_idx]) {
                node->right = new TreeNode(post_val);
                stk.push(node->right);
            } else {
                while (!stk.empty() && (stk.top()->val == inorder[in_idx])) {
                    node = stk.top();
                    stk.pop();
                    --in_idx;
                }
                node->left = new TreeNode(post_val);
                stk.push(node->left);
            }
        }

        return root;
    }
};


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

相关文章:

  • Vue 的生命周期函数 和 Vuex
  • Python 连接 Redis 进行增删改查(CRUD)操作
  • OCR识别铁路电子客票
  • 设计模式之责任链模式(Chain Of Responsibility)
  • JVM详解:JVM的系统架构
  • 「Py」Python基础篇 之 Python都可以做哪些自动化?
  • linux(2)之buildroot使用手册
  • asp.net mvc游戏门户网站
  • 基于U2-Net如何训练一个一键抠图模型
  • 什么是量子优势?
  • 系列十六、Spring IOC容器的扩展点
  • vue3-10
  • 【C++】构造函数和析构函数第四部分(深拷贝和浅拷贝)--- 2023.11.25
  • Spring Boot 3 + Spring Security 6 最新版本修改 Json 登录后 RememberMe 功能问题失效的解决方案
  • NextJS开发:封装shadcn/ui中的AlertDialog确认对话框
  • windows系统mobaxterm远程执行linux上ssh命令
  • 中伟视界:AI智能分析盒子的人数统计AI算法通过什么算法模型可以解决重复统计的问题?
  • 【AI考证笔记】NO.1人工智能的基础概念
  • Mysql更新Blob存储的Josn数据
  • c++调用openssl对文件加解密
  • ubuntu配置免密登录vscode
  • 如何优化 Elasticsearch 查询性能
  • 华为P40无法链接adb的解决记录
  • 深度学习之六(自编码器--Autoencoder)
  • 面向植保任务的无人机集群系统及其应用研究
  • shell编程系列(4)-循环结构