重建二叉树(NC12/考察次数Top31/难度中等)

Posted 码农指南

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了重建二叉树(NC12/考察次数Top31/难度中等)相关的知识,希望对你有一定的参考价值。

描述:
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。

示例1
输入:
[1,2,3,4,5,6,7],[3,2,4,1,6,5,7]
返回值:
{1,2,5,3,4,6,7}
(题目来自牛客网)

用C++实现如下

/**
 *                                //定义二叉树的结构,包括val,TreeNode* left和TreeNode* right
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* reConstructBinaryTree(vector<int> pre,vector<int> vin) {
        //思路,输入某二叉树的前序遍历和中序遍历结果,重建改二叉树
        //前序遍历为 根 左(全部) 右(全部)
        //中序遍历为 左(全部) 根 右(全部)
        //前序和后序可以实现父子节点的分离,配合中序遍历,可以确定一棵树(前提是不含有重复的val值)
        //方法,使用递归算法进行求解
        return rebuild(pre, 0, pre.size()-1, vin, 0, vin.size()-1);    //使用rebuild递归函数进行求解;
    }
    
    TreeNode* rebuild(vector<int>& pre, int pre_left, int pre_right, 
                      vector<int>& vin, int vin_left, int vin_right){
        if(pre_left > pre_right)                                      //size等于0,表示为空,vin与之对应着
            return nullptr;
        TreeNode* root = new TreeNode(pre[pre_left]);                 //建立根节点,前序遍历第一个为根节点,括号中放val值;
        for(int i = vin_left; i<=vin_right; i++)                      //遍历中序,直到找到根节点的val;(由于不重复)
        {
            if(vin[i] == pre[pre_left])                               //碰到了根节点;
            {
                root->left = rebuild(pre, pre_left+1, pre_left+i-vin_left, vin, vin_left, i-1);
                //由于是根据中序进行遍历的,根据for循环可以知道,i-vin_left可以表示根节点左边有多少个元素
                root->right = rebuild(pre, pre_left+i-vin_left+1, pre_right, vin, i+1, vin_right);
                break;
            }
        }
        return root;                                                   //返回值
    }
};

纯手撕代码,如果觉得内容不错麻烦点个赞,后面陆续配上Top100算法题通俗易懂的讲解视频,可以花两个月时间完全掌握,进大厂不是梦,转行狗亲测!

以上是关于重建二叉树(NC12/考察次数Top31/难度中等)的主要内容,如果未能解决你的问题,请参考以下文章

求二叉树的层序遍历(NC15/考察次数Top6/难度中等)

二叉树的之字形层序遍历(NC14/考察次数Top21/难度中等)

二叉树根节点到叶子节点的所有路径和(NC5/考察次数Top53/难度中等)

在二叉树中找到两个节点的最近公共祖先(NC102/考察次数Top25/难度中等)

实现二叉树的先序,中序和后序遍历(NC45/考察次数Top4/难度中等)

二叉树根节点到叶子节点和为指定值的路径(NC8/考察次数Top54/难度中等)