二叉树经典题之从前序和中序遍历构建二叉树

Posted 快乐江湖

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二叉树经典题之从前序和中序遍历构建二叉树相关的知识,希望对你有一定的参考价值。

前言:

二叉树刷题是有固定思维的,请移步

README】二叉树刷题框架

从前序和中序遍历构建二叉树

题目

点击跳转:LeetCode

在这里插入图片描述

思路

这道题体现的就是分治的思想,我们知道前序遍历啊可以确定一个子树的根节点,而中序遍历可以根据根节点将一颗子树再次分为左右子树,所以只需分解完成依次,后面的过程就是递归过程

如下,首先根据前序确定这棵树的根节点为A,然后根据中序遍历确定A的左右子树在中序中的范围
在这里插入图片描述
下一步又分别确定了左右子树的根节点为B和C
在这里插入图片描述
剩下的就是递归过程
在这里插入图片描述

代码

class Solution {
public:
    TreeNode* _buildTree(vector<int>& preorder,vector<int>& inorder,int& previ,int inbegin,int inend)
    {
        if(previ >= preorder.size())//前序走完,所有结点构建完成
            return nullptr;
        if(inbegin>inend)//中序区间不存在,也就是该结点不存在左子树
            return nullptr;
        
        int rooti=inbegin;//用rooti保存中序遍历中root的位置
        while(rooti<=inend)//寻找
        {
            if(inorder[rooti]==preorder[previ])
                break;
            else
                rooti++;
                
        }
        TreeNode* root=new TreeNode(preorder[previ]);//依此时前序遍历的第一个值创建一个结点
        ++previ;
        //划分区间,剩余的过程就是递归
        //即[inbegin,rooti-1]root[rooti+1,inend]
        root->left=_buildTree(preorder,inorder,previ,inbegin,rooti-1);
        root->right=_buildTree(preorder,inorder,previ,rooti+1,inend);
        
        return root;
            
        
    }
    
    
    TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) 
    {
        int previ=0;
        return _buildTree(preorder,inorder,previ,0,inorder.size()-1);
    }
};

在这里插入图片描述

注意

上述代码中有一个很重要的判断

if(inbegin>inend)//中序区间不存在,也就是该结点不存在左子树
    return nullptr;

这个判断是为了放置中序遍历区间不存在的情况,如下,下面的树中结点A没有左子树,所以就会导致inbegin > inend
在这里插入图片描述

以上是关于二叉树经典题之从前序和中序遍历构建二叉树的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode105 从前序和中序序列构造二叉树

通过遍历序列构造二叉树(扩展二叉树的先序先序和中序后序和中序层序和中序)附可执行完整代码

重建二叉树

重建二叉树

输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构;输入后序和中序,构造二叉树,并输出该二叉树的层序前序中序后序遍历结构

根据二叉树的前序遍历和中序遍历构建二叉树的c语言完整代码