剑指Offer07【重建二叉树】递归图解

本文介绍了一种根据二叉树的前序遍历和中序遍历结果重建该二叉树的方法。通过递归地确定根节点及其左右子树,最终实现二叉树的重构。文中详细解释了递归过程,并提供了Java实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述

  输入某二叉树的前序遍历中序遍历的结果,请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字

输入输出

输入

前序遍历  preorder = [3,9,20,15,7]
中序遍历  inorder = [9,3,15,20,7]

返回如下的二叉树:
重建的二叉树

限制:0 <= 节点个数 <= 5000

解题思路

前序遍历特点:节点按照[根节点|左子树|右子树]排序,
  如上例:pre[]=[3|9|20,15,7]
中序遍历特点:节点按照[左子树|根节点|右子树]排序,
  如上例:in[]=[9|3|15,20,7]

递归步骤:

  1. 取前序遍历数组首元素pre[0]=3,该首元素为根节点;
  2. 在中序遍历数组 in[ ] 中找到根节点3的下标 i ,根据中序遍历[左|根|右]的特性,下标[0,i-1]范围对应根节点3的左子树节点;下标[i+1,in.length-1]范围对应根节点3的右子树节点;
  3. 由步骤 2 知左子树节点数目为 i,根据前序遍历[根|左|右]的特性,当pre[0]为根节点时,其左子树节点对应下标为[1,i],其右子树节点对应下标为[i+1,pre.length-1]。
  4. 递归进行上述1,2,3的步骤。每次递归需要截取此时的前序遍历与中序遍历数组。

图解递归树

对于上例输入,递归树如下:

递归树

根据递归树得到重建的二叉树:

重建的二叉树

代码

Java版本:递归法
import java.util.*;
public class Solution {
    public TreeNode reConstructBinaryTree(int [] pre,int [] in) {
        if(pre.length==0||in.length==0){
            return null;
        }
        TreeNode root=new TreeNode(pre[0]);
        for(int i=0;i<in.length;i++){
            if(in[i]==pre[0]){
                root.left=reConstructBinaryTree(
                	      Arrays.copyOfRange(pre,1,i+1),
                          Arrays.copyOfRange(in,0,i));
                root.right=reConstructBinaryTree(
                          Arrays.copyOfRange(pre,i+1,pre.length),
                          Arrays.copyOfRange(in,i+1,in.length));
            }
        }
        return root;
    }
}
注意:
java中java.util.Arrays下的函数:
public static int[] copyOfRange(int[] original,int from, int to)
功能:拷贝原数组original的区间[from,to)内的元素,返回拷贝后的数组。注意拷贝区间左闭右开。

  力扣地址:剑指 Offer 07. 重建二叉树

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

VoidTaoist

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值