从前序与中序遍历序列构造二叉树
2026年4月16日大约 1 分钟
从前序与中序遍历序列构造二叉树
使用的方法
递归
解题思路
- 给定二叉树的前序遍历和中序遍历,我们需要根据这两种遍历结果来构造出原始的二叉树。
- 前序遍历的第一个元素是树的根节点。我们可以根据这个根节点在中序遍历中找到它的位置,从而确定左子树和右子树的范围。
- 递归地对左子树和右子树进行构建。对于左子树,我们使用前序遍历中根节点之后的元素以及中序遍历中根节点之前的元素;对于右子树,我们使用前序遍历中根节点之后的元素以及中序遍历中根节点之后的元素。
- 递归的终止条件是当前序遍历的起始索引大于或等于结束索引时,返回 null,表示当前子树为空。
- 最后返回构建好的树的根节点作为结果。
代码实现
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
public TreeNode buildTree(int[] preorder, int[] inorder) {
return build(preorder,0,preorder.length,inorder,0,inorder.length);
}
public TreeNode build(int[] preOrder,int p_start,int p_end,int[] inOrder,int i_start,int i_end){
if(p_start == p_end)
return null;
int root_v = preOrder[p_start];
TreeNode root = new TreeNode(root_v);
int i_root_index = 0;
for(int i = i_start;i<i_end;i++){
if(root_v == inOrder[i]){
i_root_index = i;
break;
}
}
int leftNum = i_root_index - i_start;
root.left = build(preOrder,p_start+1,p_start+leftNum+1,inOrder,i_start,i_root_index);
root.right = build(preOrder,p_start + leftNum+1,p_end,inOrder,i_root_index+1,i_end);
return root;
}
}