要从前序遍历和中序遍历序列构造二叉树,可以使用递归的方法。

首先,观察前序遍历和中序遍历的特点:

前序遍历的第一个元素是根节点,然后是左子树的前序遍历序列,再是右子树的前序遍历序列; 中序遍历的根节点将序列划分为左子树的中序遍历序列和右子树的中序遍历序列。

因此,我们可以根据前序遍历序列的第一个元素,找到在中序遍历序列中的位置,将序列划分为左子树和右子树的中序遍历序列。然后,根据左子树和右子树的中序遍历序列的长度,可以在前序遍历序列中找到左子树和右子树的前序遍历序列。接下来,我们可以递归地构造左子树和右子树。

以下是Java代码的实现:

class TreeNode {
    int val;
    TreeNode left;
    TreeNode right;
    TreeNode(int x) { val = x; }
}

public class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return build(preorder, 0, preorder.length - 1, inorder, 0, inorder.length - 1);
    }

    private TreeNode build(int[] preorder, int preStart, int preEnd, int[] inorder, int inStart, int inEnd) {
        if (preStart > preEnd || inStart > inEnd) {
            return null;
        }

        int rootVal = preorder[preStart];
        int rootIndex = 0;
        for (int i = inStart; i <= inEnd; i++) {
            if (inorder[i] == rootVal) {
                rootIndex = i;
                break;
            }
        }

        int leftLength = rootIndex - inStart;
        TreeNode root = new TreeNode(rootVal);
        root.left = build(preorder, preStart + 1, preStart + leftLength, inorder, inStart, rootIndex - 1);
        root.right = build(preorder, preStart + leftLength + 1, preEnd, inorder, rootIndex + 1, inEnd);

        return root;
    }
}

在上述代码中,buildTree方法是入口方法,它调用了build方法进行递归构造二叉树。build方法的参数包括前序遍历序列和中序遍历序列的起始位置和结束位置。在build方法中,首先判断起始位置和结束位置是否有效,如果不是有效的位置,则返回null。然后,找到前序遍历序列中的根节点,在中序遍历序列中找到根节点的位置。根据根节点的位置,可以得到左子树和右子树的长度,然后递归地构造左子树和右子树。最后,返回根节点。

使用该方法,可以通过前序遍历和中序遍历序列构造二叉树

java:从前序与中序遍历序列构造二叉树

原文地址: https://www.cveoy.top/t/topic/iN5u 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录