二叉树 根据后序遍历生成二叉树

题目:给定一个二叉树的后序遍历数组arr[],生成二叉树

解题思路:根据搜索二叉树的性质,数组的最后一位arr[end]是二叉树的根,而且数组的左部分比arr[end]小,是根节点的左子数,数字的右部分比arr[end]大,是数组的右子数。

Example:

树的形状如上图,后序遍历为:1 3 2 6  8 7 5

arr[end] = 5;

左部分(左子树):{1,3,2}

右部分(右子树):{6,8,7}

package cn.edu.algorithm.prototype;

/**
 * 根据后序遍历构造二叉树
 */
public class Main {
    public static void main(String[] args) {
        int[] arr = {1, 3, 2, 6, 8, 7, 5};
        TreeNode root = postToBST(arr, 0, arr.length - 1);
        inOrder(root);
    }
    public static void inOrder(TreeNode node) {

        if (node != null) {
            inOrder(node.left);
            System.out.println(node.value);
            inOrder(node.right);
        }
    }
    public static TreeNode postToBST(int[] arr, int start, int end) {
        if (start > end)
            return null;
        TreeNode node = new TreeNode(arr[end]);
        int less = -1;
        int more = end;
        for (int i = start; i < end; i++) {
            if (arr[end] > arr[i]) {
                less = i;
            } else {
                more = more == end ? i : more;
            }
        }
        node.left = postToBST(arr, start, less);
        node.right = postToBST(arr, more, end - 1);
        return node;
    }
}
class TreeNode {
    protected int value;
    protected TreeNode left;
    protected TreeNode right;

    public TreeNode(int value) {
        this.value = value;
    }
}

 

posted @ 2016-09-08 11:08  googlemeoften  阅读(1150)  评论(0编辑  收藏  举报