Leetcode JAVA刷刷站(105)从前序与中序遍历序列构造二叉树
一、题目概述
二、思路方向
- 理解遍历顺序:
- 先序遍历(preorder):根节点 -> 左子树 -> 右子树
- 中序遍历(inorder):左子树 -> 根节点 -> 右子树
- 利用先序遍历的第一个元素作为根节点:
- 先序遍历的第一个元素总是当前子树的根节点。
- 在中序遍历中找到根节点的位置:
- 这个位置将中序遍历分为左子树和右子树。
- 递归构建左子树和右子树:
- 使用中序遍历中根节点左侧的数组构建左子树,使用先序遍历中根节点之后的元素构建左子树。
- 使用中序遍历中根节点右侧的数组构建右子树,使用先序遍历中左子树之后(即根节点之后紧接着的元素)的元素构建右子树。
- 递归终止条件:
- 当先序遍历或中序遍历的数组为空时,返回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
是构建二叉树的核心逻辑。
结语
龙游浅水遭虾戏
虎落平阳被犬欺
!!!