首页 > 其他分享 >【二叉树】已知前序中序、中序后序遍历构造二叉树

【二叉树】已知前序中序、中序后序遍历构造二叉树

时间:2025-01-17 18:05:32浏览次数:1  
标签:right TreeNode val int 中序 二叉树 inorder 前序 left

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

/**
 * 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:
    int n;
    unordered_map<int, int> pos;

    TreeNode* build(vector<int> &preorder, vector<int> &inorder, int il, int ir, int pl, int pr)
    {
        TreeNode* root = new TreeNode(preorder[pl]);
        int k = pos[root->val];
        if (il < k) //如果左子树存在,递归构建左子树
            root->left = build(preorder, inorder, il, k - 1, pl + 1, pl + 1 + k - 1 - il);
        if (ir > k) //如果右子树存在,递归构建右子树
            root->right = build(preorder, inorder, k + 1, ir, pl + 1 + k - 1 - il + 1, pr);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
        n = preorder.size();
        for (int i = 0; i < n; i++) pos[inorder[i]] = i;
        return build(preorder, inorder, 0, n - 1, 0, n - 1);
    }
};

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

/**
 * 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:
    int n;
    unordered_map<int, int> pos;

    TreeNode* build(vector<int> &inorder, vector<int> &postorder, int il, int ir, int pl, int pr)
    {
        TreeNode* root = new TreeNode(postorder[pr]);
        int k = pos[root->val];
        if (il < k) 
            root->left = build(inorder, postorder, il, k - 1, pl, pl + k - 1 - il);
        if (ir > k) 
            root->right = build(inorder, postorder, k + 1, ir, pl + k - 1 - il + 1, pr - 1);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) {
        n = inorder.size();
        for (int i = 0; i < n; i++) pos[inorder[i]] = i;
        return build(inorder, postorder, 0, n - 1, 0, n - 1);
    }
};

标签:right,TreeNode,val,int,中序,二叉树,inorder,前序,left
From: https://www.cnblogs.com/Tshaxz/p/18677448

相关文章

  • 数据结构—《二叉树的定义与特性》
    目录1.二叉树的定义2.特殊的二叉树1)满二叉树2)完全二叉树3)二叉排序树。4)平衡二又树。5)正则二文树3.二叉树的性质4.二叉树的存储结构1)顺序存储结构2)链式存储结构1.二叉树的定义二叉树是一种特殊的树形结构,其特点是每个结点至多只有两棵子树(即二叉树中不存在度大......
  • 数据结构之链式二叉树
    前言:前面我们学习了树相关的概念及堆的实现,今天来看看二叉树的实现。正式实现二叉树前,我们先了解一些基础知识。对于二叉树基础知识不清楚的可以观看数据结构------树这篇文章,回顾一下知识,有助于理解二叉树。二叉树的遍历方式都有哪些呢?.前序遍历:按照根节点,左节点,右节......
  • 代码随想录:最大二叉树
    白送/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr),right(nullptr){}......
  • 代码随想录:从中序与后序遍历序列构造二叉树
    /**Definitionforabinarytreenode.structTreeNode{intval;TreeNode*left;TreeNode*right;TreeNode():val(0),left(nullptr),right(nullptr){}TreeNode(intx):val(x),left(nullptr),right(nullptr){}TreeNode(intx,TreeNo......
  • 代码随想录:完全二叉树的节点个数
    拿到一个节点,先判断是不是等边三角形,若是直接返回2^n-1,位运算写在专题中/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*......
  • LeetCode:102.二叉树的层序遍历
    LeetCode:102.二叉树的层序遍历解题思路层序遍历顺序就是广度优先遍历。不过在遍历时候需要记录当前节点所处的层级,方便将其添加到不同的数组中。/***Definitionforabinarytreenode.*functionTreeNode(val,left,right){*this.val=(val===undefined?0:......
  • LeetCode:111.二叉树的最小深度
    LeetCode:111.二叉树的最小深度解题思路求最小深度,考虑使用广度优先遍历。在广度优先遍历过程中,遇到叶子节点,停止遍历,返回节点层级。解题步骤广度优先遍历整棵树,并记录每个节点的层级。遇到叶子节点,返回节点层级,停止遍历。//dfsvarminDepth=function(root){if(!root......
  • 数据结构与算法之二叉树: LeetCode 108. 将有序数组转换为二叉搜索树 (Ts版)
    将有序数组转换为二叉搜索树https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/描述给你一个整数数组nums,其中元素已经按升序排列请你将其转换为一棵平衡二叉搜索树示例1输入:nums=[-10,-3,0,5,9]输出:[0,-3,9,-10,nul......
  • 数据结构与算法之二叉树: LeetCode 110. 平衡二叉树 (Ts版)
    平衡二叉树https://leetcode.cn/problems/balanced-binary-tree/description/描述给定一个二叉树,判断它是否是平衡二叉树示例1输入:root=[3,9,20,null,null,15,7]输出:true示例2输入:root=[1,2,2,3,3,null,null,4,4]输出:false示例3输入:root=[]输......
  • 数据结构与算法之二叉树: LeetCode 117. 填充每个节点的下一个右侧节点指针 II (Ts版)
    填充每个节点的下一个右侧节点指针IIhttps://leetcode.cn/problems/populating-next-right-pointers-in-each-node-ii/description/描述给定一个二叉树:structNode{intval;Node*left;Node*right;Node*next;}填充它的每个next指针,让这个指针指向其......