首页 > 其他分享 >剑指 Offer 07. 重建二叉树

剑指 Offer 07. 重建二叉树

时间:2022-08-17 15:35:50浏览次数:97  
标签:preorder 遍历 07 Offer int root 中序 二叉树 inorder

剑指 Offer 07. 重建二叉树

题目大意

输入某二叉树的前序遍历和中序遍历的结果,请构建该二叉树并返回其根节点。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。

示例1

Input: preorder = [3,9,20,15,7], inorder = [9,3,15,20,7]
Output: [3,9,20,null,null,15,7]

解题思路

  1. 通过前序遍历结果弹栈作为root节点, 根据中序遍历结果划分左子树和右子树
  2. 如何判断所给的前序遍历结果和中序遍历结果是对应的

方法1: 递归求解

# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def buildTree(self, preorder, inorder):
        """
        :type preorder: List[int]
        :type inorder: List[int]
        :rtype: TreeNode
        """
        if inorder:
            idx = inorder.index(preorder.pop(0))
            root = TreeNode(inorder[idx])
            root.left = self.buildTree(preorder, inorder[:idx])
            root.right = self.buildTree(preorder, inorder[idx+1:])
            return root

上述代码不具备检测非法输入的能力, 需要补充的逻辑很简单: 前序遍历结果弹栈之后, 判断这个值是否在中序遍历结果中, 没有的话, 提示非法输入(C++中是对中序遍历结果从头开始遍历, 如果找到尾都没找到这个值, 则输入非法)

#include <iostream>
#include <cstdio>

using namespace std;

struct BinaryTreeNode
{
    int value;
    BinaryTreeNode* left;
    BinaryTreeNode* right;
};

BinaryTreeNode* Construct(int* preorder, int* inorder, int length)
{
    if(preorder == NULL || inorder == NULL || length <= 0)
        return NULL;
    return ConstructCore(preorder, preorder + length - 1,
            inorder, inorder + length - 1);
}

BinaryTreeNode* ConstructCore
(
    int* startPreorder, int* endPreorder,
    int* startInorder, int* endInorder
)
{
    // 前序遍历序列的第一个数字是根节点的值
    int rootValue = startPreorder[0];
    BinaryTreeNode* root = new BinaryTreeNode();
    root->value = rootValue;
    root->left = root->right = NULL;

    if(startPreorder == endPreorder)
    {
        if(startInorder == endInorder
                && *startPreorder == *startInorder)
            return root;
        else
            // 判断输入是否合法
            throw std::exception("Invalid input.")
    }

    // 在中序遍历中找到跟节点的值
    int* rootInorder = startInorder;
    while(rootInorder <= endInorder && *rootInorder != rootValue)
        ++ rootInorder;
    if(rootInorder == endInorder && *rootInorder != rootValue)
        throw std::exception("Invalid input."); // 如果遍历Inorder最后都没有对应的跟节点,则视为无效输入

    int leftLength = rootInorder - startInorder;
    int* leftPreorderEnd = startPreorder + leftLength;
    if(leftLength > 0)
    {
        // 构建左子树
        root->left = ConstructCore(startPreorder + 1,
                leftPreorderEnd, startInorder, rootInorder - 1);
    }
    if(leftLength < endPreorder - startPreorder)
    {
        // 构建右子树
        root->right = ConstructCore(leftPreorderEnd + 1,
                endPreorder, rootInorder + 1, endInorder);
    }

    return root;
}

标签:preorder,遍历,07,Offer,int,root,中序,二叉树,inorder
From: https://www.cnblogs.com/mujuna/p/16595393.html

相关文章

  • [JSOI2007] 字串加密
    题链:luoguJS同学?Description让JS同学对环形字符串进行重组加密。加密规则是:列出\(n\)个字符串并字典序升序,一次取末尾字符作为加密后的长度为\(n\)的密码串。......
  • 2022-8-17 剑指offer-二叉树-递归
    剑指OfferII054.所有大于等于节点的值之和难度中等35收藏分享切换为英文接收动态反馈给定一个二叉搜索树,请将它的每个节点的值替换成树中大于或者等于该节点值......
  • Windows11下使用WSL2安装Ubuntu(详解+踩坑)错误代码:0x800701bc
    前言曾经在Windows10上使用过WindowsforLinux后来换到Windows11,但因为WSL踩了不少坑。(因为Windows11升级之后使用的是WSL2而非Win10中的WSL1且无法自动升级,因此我们需......
  • 《GB24407-2012》PDF下载
    《GB24407-2012专用校车安全技术条件》PDF下载《GB24407-2012》简介本标准规定了专用校车术语和定义、类型划分、要求及试验方法;本标准适用于幼儿园阶段3周岁以上及九......
  • [2007年NOIP普及组] 纪念品分组
    元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪......
  • 剑指Offer-62-圆圈中最后剩下的数字
    约瑟夫环问题已知n个人(以编号1,2,3…n分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出圈;他的下一个人又从1开始报数,数到m的那个人又出圈;依此......
  • 阿里工作8年,肝到P7就剩这份学习笔记了,已助朋友拿到10个Offer
    在阿里工作了8年,工作压力大,节奏快,但是从技术上确实得到了成长,尤其是当你维护与大促相关的系统的时候,熬到P7也费了不少心思,小编也是个爱学习的人,把这几年的工作经验整理成......
  • 2022-8-16 剑指offer-二叉树
    剑指OfferII053.二叉搜索树中的中序后继难度中等57收藏分享切换为英文接收动态反馈给定一棵二叉搜索树和其中的一个节点 p ,找到该节点在树中的中序后继。如果......
  • [2007年NOIP普及组] 纪念品分组
    [2007年NOIP普及组]纪念品分组思路:运用贪心算法。将纪念品按价格排序,然后一前一后两两组队,如果没有超过上限w,就组队成功;反之,就失败,较大的一个单独成一组,较小的再等别的来......
  • RISC-V MCU 基于 CH32V307 工业物联网平台系统
    RISC-VMCU基于CH32V307工业物联网平台系统目录RISC-VMCU基于CH32V307工业物联网平台系统第一部分设计概述1.1设计目的1.2应用领域1.3主要技术特点1.4关键性......