首页 > 其他分享 >leetcode105. 从前序与中序遍历序列构造二叉树,步骤详解附代码

leetcode105. 从前序与中序遍历序列构造二叉树,步骤详解附代码

时间:2024-07-27 16:54:55浏览次数:17  
标签:preorder 遍历 中序 节点 leetcode105 二叉树 inorder 前序

leetcode105. 从前序与中序遍历序列构造二叉树

给定两个整数数组 preorderinorder ,其中 preorder 是二叉树的先序遍历, inorder 是同一棵树的中序遍历,请构造二叉树并返回其根节点。
在这里插入图片描述

示例 1:
输入: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
输出: [3,9,20,null,null,15,7]

示例 2:
输入: preorder = [-1], inorder = [-1]
输出: [-1]

算法思路

前序遍历特性:在前序遍历中,第一个元素总是根节点。
中序遍历特性:在中序遍历中,根节点将序列分为左子树和右子树。

具体算法步骤

检查空序列:如果前序序列为空,返回 NULL 表示没有树。

创建根节点:使用前序遍历的第一个元素作为根节点的值,并创建相应的 TreeNode 对象。

确定根节点在中序遍历中的位置:通过遍历中序序列找到根节点的位置,这个位置将中序序列分为左子树和右子树。

划分左右子树的前序和中序序列:根据根节点在中序序列中的位置,划分出左子树和右子树的前序和中序序列。

递归构建子树:对左子树和右子树的序列递归调用 traversal 函数来构建子树,并将结果分别赋给根节点的左右子节点。

返回根节点:完成子树构建后,返回根节点,这样就完成了整棵树的构建。

这里有个注意的点,就是我们先确定中序遍历的数组内容,再确定先序遍历的数组内容,这样的好处是我们可以根据中序数组的长度来确定先序遍历的数组。如果反过来的话会很麻烦,读者可以自己试试。
具体来说
划分左右子树
在中序遍历中,根节点左边的元素构成左子树,右边的元素构成右子树。因此,我们可以通过 del 来划分左右子树的中序遍历序列:
leftInorder 包含了根节点左边的所有元素。
rightInorder 包含了根节点右边的所有元素。

确定前序遍历中的左右子树序列
前序遍历中,根节点后面的元素按照左子树和右子树的顺序排列。因此,我们可以根据 leftInorder 的大小来确定左子树在前序遍历中的序列:
leftPreorder 包含了左子树的所有前序遍历元素。
同理,右子树的前序遍历序列 rightPreorder 可以通过 leftInorder.size() 来确定起始位置。

具体代码

class Solution {
public:
    TreeNode* traversal(vector<int>& preorder,vector<int>& inorder)
    {
        if(preorder.size()==0) return NULL;
        int rootValue=preorder[0];
        TreeNode* root=new TreeNode(rootValue);
        if(preorder.size()==1) return root;
        int del;
        for(del=0;del<inorder.size();del++)
        {
            if(inorder[del]==rootValue) break;
        }
        vector<int> leftInorder(inorder.begin(),inorder.begin()+del);
        vector<int> rightInorder(inorder.begin()+del+1,inorder.end());
        vector<int> leftPreorder(preorder.begin()+1,preorder.begin()+1+leftInorder.size());
        vector<int> rightPreorder(preorder.begin()+1+leftInorder.size(),preorder.end());
        root->left=traversal(leftPreorder,leftInorder);
        root->right=traversal(rightPreorder,rightInorder);
        return root;
    }
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
     if(inorder.size()==0 || preorder.size()==0) return NULL;
     return traversal(preorder,inorder);
    }
};

做完此题,可以看看姊妹题

leetcode106从中序与后序遍历序列构造二叉树

需要注意的是,只有中序与前序、中序与后序才能确定唯一的二叉树,前序和后序无法确定唯一的二叉树!

标签:preorder,遍历,中序,节点,leetcode105,二叉树,inorder,前序
From: https://blog.csdn.net/qq_51350957/article/details/140735630

相关文章

  • 【数据结构】二叉树
    目录二叉树特殊二叉树二叉树的性质二叉树的模拟实现存储结构接口实现内部类遍历前序遍历中序遍历后序遍历遍历确定二叉树层序遍历获取节点个数获取叶子节点的个数获取第K层节点的个数获取二叉树的高度检测值为value的元素是否存在判断一棵树是不是完全二叉树练习链接......
  • 二叉树的遍历
    提纲挈领的说,先序中序后序的遍历区别在于遍历根节点的时机。 1.先序        1.1递归形式 遍历过程为:①访问根结点;②先序遍历其左子树;③先序遍历其右子树。voidPreOrderTraversal(BinTreeBT){if(BT){printf(“%d”,BT->Data);......
  • 二叉树及其存储实现C语言(附上源码)
    1.什么是二叉树        二叉树是一种特殊的树型结构,其特点是每个结点至多只有两棵子树(即二叉树不存在度大于二的结点),并且二叉树的子树有左右之分,次序不可颠倒【有序树】。 2.二叉树的定义二叉树T:一个有穷的结点集合。    -这个集合可以为空;    -......
  • 数据结构 二叉树 前 中 后 序列
    简单二叉树的遍历如果看完还是不太懂就观看速成视频https://www.bilibili.com/video/BV1Ub4y147Zv/?spm_id_from=333.337.search-card.all.click&vd_source=e5f8765d50fb89ef04eb150bd76075b5引用资料文献链接放到篇尾简单术语解释节点(Node):二叉树中的一个元素,包含值和......
  • 【秋招 Learning_note】| 拿捏二叉树考点!(一)
    文章目录引言二叉树的性质性质一结点数与层数的关系性质二结点数与层数的关系性质三叶子节点与度为2的节点关系性质四深度与节点数的关系两种特殊的二叉树满二叉树完全二叉树二叉树的遍历顺序前序遍历中序遍历后序遍历常考内容及详细解法题型一、基本概念与性质题......
  • leetcode103. 二叉树的锯齿形层序遍历,简单易懂附代码详解
    leetcode103.二叉树的锯齿形层序遍历给你二叉树的根节点root,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。示例1:输入:root=[3,9,20,null,null,15,7]输出:[[3],[20,9],[15,7]]示例2:输入:root=[1]输出:[[1......
  • 二叉树的分类
    二叉树是最常见的树,二叉树的每个节点最多只有两个子节点二叉树的分类 完全二叉树 指二叉树的所有节点按照从左往右填充就像这样: 满二叉树是一种完全二叉树,当完全二叉树每个层次都被填满时,就是满二叉树例如上图中的最后一棵树堆 堆是一种带有特定排序的完全二叉......
  • 二叉树的三序遍历之非递归版
    二叉树的先序遍历/***Definitionforabinarytreenode.*structTreeNode{*intval;*TreeNode*left;*TreeNode*right;*TreeNode():val(0),left(nullptr),right(nullptr){}*TreeNode(intx):val(x),left(nullptr),right(n......
  • 【数据结构】二叉树
    二叉树结构描述:#include<iostream>#include<queue>usingnamespacestd;typedefintDataType;classNode{private:DataTypedata;Node*left;Node*right;friendclassBinaryTree;};typedefclassBinaryTree{private:N......
  • 算法力扣刷题记录 五十七【236. 二叉树的最近公共祖先】和【235. 二叉搜索树的最近公
    前言公共祖先解决。二叉树和二叉搜索树条件下的最近公共祖先。二叉树篇继续。一、【236.二叉树的最近公共祖先】题目阅读给定一个二叉树,找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树T的两个节点p、q,最近公共祖先表示为一......