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

根据一棵树的前序遍历与中序遍历构造二叉树。

注意:
你可以假设树中没有重复的元素

例如,给出

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

返回如下的二叉树:

    3
   / \
  9  20
    /  \
   15   7

解题思路与中序后序构造二叉树一致,只不过是后序的根节点在最后换成前序的根节点在最前

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
class Solution {
    public TreeNode buildTree(int[] preorder, int[] inorder) {
        return getNode(preorder, inorder, 0, inorder.length-1, 0);
    }
    public TreeNode getNode( int[] preorder,int[] inorder, int instart, int inend, int prestart) {
        // 结束条件,开始大于结束
        if (instart > inend) {
            return null;
        }
        // 节点值
        int nodeVal = preorder[prestart];
        //  当前节点
        TreeNode node = new TreeNode(nodeVal);
        // 节点中中序数组中的下标
        int nodeIndex = 0;
        for (int i = instart; i <= inend; i++) {
            if (nodeVal == inorder[i]) {
                nodeIndex = i;
                break;
            }
        }
        // 左子树(0,index),根->新prestart(原prestart+1)
        node.left = getNode(preorder, inorder, instart, nodeIndex - 1, prestart +1);
        // 右子树(index+1,inend),根->新prestart(原prestart + 左子树长度(nodeIndex-instart) + 自己(1))
        node.right = getNode(preorder, inorder, nodeIndex + 1, inend, prestart + (nodeIndex-instart) + 1);
        return node;
    }
}

你可能感兴趣的:(二叉树,算法,数据结构,java)