Leetcode JAVA刷刷站(105)从前序与中序遍历序列构造二叉树

一、题目概述

 二、思路方向 

  1. 理解遍历顺序
    • 先序遍历(preorder):根节点 -> 左子树 -> 右子树
    • 中序遍历(inorder):左子树 -> 根节点 -> 右子树
  2. 利用先序遍历的第一个元素作为根节点
    • 先序遍历的第一个元素总是当前子树的根节点。
  3. 在中序遍历中找到根节点的位置
    • 这个位置将中序遍历分为左子树和右子树。
  4. 递归构建左子树和右子树
    • 使用中序遍历中根节点左侧的数组构建左子树,使用先序遍历中根节点之后的元素构建左子树。
    • 使用中序遍历中根节点右侧的数组构建右子树,使用先序遍历中左子树之后(即根节点之后紧接着的元素)的元素构建右子树。
  5. 递归终止条件
    • 当先序遍历或中序遍历的数组为空时,返回null。

三、代码实现 

class TreeNode {  
    int val;  
    TreeNode left;  
    TreeNode right;  
  
    TreeNode(int x) {  
        val = x;  
    }  
}  
  
public class Solution {  
    public TreeNode buildTree(int[] preorder, int[] inorder) {  
        if (preorder == null || inorder == null || preorder.length != inorder.length) {  
            return null;  
        }  
        return buildTreeHelper(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);  
    }  
  
    private TreeNode buildTreeHelper(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {  
        if (preStart > preEnd || inStart > inEnd) {  
            return null;  
        }  
  
        // 先序遍历的第一个元素是根节点  
        int rootVal = preorder[preStart];  
        TreeNode root = new TreeNode(rootVal);  
  
        // 在中序遍历中找到根节点的位置  
        int rootIndexInorder = inStart;  
        while (inorder[rootIndexInorder] != rootVal) {  
            rootIndexInorder++;  
        }  
  
        // 构建左子树和右子树  
        int leftSubtreeSize = rootIndexInorder - inStart;  
        root.left = buildTreeHelper(preorder, preStart + 1, preStart + leftSubtreeSize, inorder, inStart, rootIndexInorder - 1);  
        root.right = buildTreeHelper(preorder, preStart + leftSubtreeSize + 1, preEnd, inorder, rootIndexInorder + 1, inEnd);  
  
        return root;  
    }  
}

执行结果: 

四、小结 

       这段代码首先定义了一个TreeNode类来表示二叉树的节点,然后Solution类中的buildTree方法利用buildTreeHelper递归地构建二叉树。buildTreeHelper是构建二叉树的核心逻辑。

 结语 

龙游浅水遭虾戏

虎落平阳被犬欺

!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

IT 青年

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

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

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

打赏作者

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

抵扣说明:

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

余额充值