从中序与后序遍历序列构造二叉树(C++实现)

简介: 从中序与后序遍历序列构造二叉树(C++实现)


题目

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


思路

代码

class Solution {
public:
    TreeNode* _build(vector<int>& inorder, vector<int>& postorder,int & peri,int lefti,int righti)
    {
        if(lefti>righti)
        {
            return nullptr;
        }
        int rooti=0;
        while(rooti<=righti)
        {
            if(postorder[peri]==inorder[rooti])
            {
                break;
            }
            rooti++;
        }
        //[lefti,rooti-1][rooti][rooti+1,righti]
        TreeNode * root=new TreeNode(postorder[peri--]);
        root->right=_build(inorder,postorder,peri,rooti+1,righti);
        root->left=_build(inorder,postorder,peri,lefti,rooti-1);
        return root;
    }
    TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder)
    {
        int i=postorder.size()-1;
        TreeNode *root=_build(inorder,postorder,i,0,postorder.size()-1);
        return root;
    }
};

代码讲解

_build 函数是一个递归函数,用于构建二叉树的子树。它接收中序遍历序列 inorder、后序遍历序列 postorder、一个引用 peri、当前子树的左边界 lefti 和右边界 righti 作为参数。

首先,检查左边界 lefti 是否大于右边界 righti,如果是,说明当前子树为空,返回 nullptr。
在后序遍历序列中,找到当前根节点的值 postorder[peri] 在中序遍历序列中的位置 rooti。
创建一个新的节点 root,值为 postorder[peri–],即后序遍历序列的最后一个元素。
递归地调用 _build 函数构建右子树,传入中序遍历序列 inorder、后序遍历序列 postorder、引用 peri、rooti+1 和 righti 作为参数。
递归地调用 _build 函数构建左子树,传入中序遍历序列 inorder、后序遍历序列 postorder、引用 peri、lefti 和 rooti-1 作为参数。
返回根节点 root。


buildTree 函数是主函数,用于调用 _build 函数构建整棵二叉树。它接收中序遍历序列 inorder 和后序遍历序列 postorder 作为参数。

初始化变量 i 为 postorder 的最后一个索引,即后序遍历序列的最后一个元素。
调用 _build 函数构建二叉树的根节点,传入中序遍历序列 inorder、后序遍历序列 postorder、引用 i、0 和 postorder.size()-1 作为参数。
返回构建的二叉树的根节点 root。

(本题完)

相关文章
|
3月前
|
传感器 定位技术 C++
基于C++的GDAL用空白栅格填充长时间序列遥感影像中的缺失图像
然后,定义需要处理的遥感影像路径列表,和识别数据缺失的逻辑。这里我们简化处理,假设已经知道哪一幅图像是缺失的,因此直接跳过识别步骤。
54 1
|
3月前
|
JavaScript 前端开发 Java
面向对象编程(C++篇2)——构造
面向对象编程(C++篇2)——构造
31 0
|
4月前
|
存储 C++
【C++】二叉树进阶之二叉搜索树(下)
【C++】二叉树进阶之二叉搜索树(下)
32 4
|
4月前
|
Java 编译器 C++
【C++】二叉树进阶之二叉搜索树(上)
【C++】二叉树进阶之二叉搜索树(上)
36 3
|
4月前
|
算法 C++
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
【C++高阶】高效搜索的秘密:深入解析搜索二叉树
42 2
|
4月前
|
存储 算法 搜索推荐
|
5月前
|
C++ 容器
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
C++之deque容器(构造、赋值、大小、插入与删除、存取、排序)
|
5月前
|
算法 搜索推荐 C++
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
C++之STL常用算法(遍历、查找、排序、拷贝、替换、算数生成、集合)
|
6天前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
29 4
|
7天前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
23 4