Java 算法-中序遍历和后序遍历构造二叉树

  今天在lintCode上面做了一道题,关于二叉树的构造,是一道数据结构中常见的问题。

1. 概览

(1).题意

根据中序遍历和后序遍历树构造二叉树

 注意事项

你可以假设树中不存在相同数值的节点

(2).样例

给出中序遍历:[1,2,3]和前序遍历:[2,1,3]. 返回如下的树:

  2
 / \
1   3

2.解题思路

  这道题是一道典型的数据结构的问题。在数据结构中,我们知道有三种遍历:先序遍历,中序遍历和后序遍历。在这三种遍历中,如果想要任取两种遍历来构造二叉树的话,必须含有中序遍历,也就是说,只有先序遍历和中序遍历,后序遍历和中序遍历这两种组合才能成功的构造二叉树。
  我们知道必须含有中序遍历才能成功的构造二叉树,那为什么呢?
  要搞清楚这个原因,我们必须清楚二叉树的三种遍历的特性。中序遍历是先遍历左节点,再遍历根,最后遍历右节点。我们可以利用这个特性,来分清哪些是根节点的左子树,哪些是根节点的右子树。
  例如:以下一棵树

Java 算法-中序遍历和后序遍历构造二叉树_第1张图片

  我们能得到中序遍历序列: [3,2,4,1,6,5,7]。如果我们得到一个根节点,那么这个根节点的左边肯定是根节点的左子树,右边肯定是根节点的右子树。那么我们怎么能拿到这个根节点呢?
  该题是中序遍历和后序遍历的问题,我们可以通过后序遍历的序列来获得。就拿上面的树来举例子,后序遍历的序列是: [3,4,2,6,7,5,1]。而后序遍历的特性,先遍历子树(先左或者先右没有特定的规则,通常来说,是先左再右),最后再遍历根,也就是说,根是最后遍历的。那在后序遍历的序列中,最后出现的肯定是根节点。
  例如:拿上面的树来说,中序遍历的序列是: [3,2,4,1,6,5,7],后序遍历的序列是: [3,4,2,6,7,5,1]。在后序遍历的序列最后出现的是1,那么1肯定是整个树的根节点,同时在中序遍历中,我们将序列分为三个中部分: [1]是根节点(根据后序遍历得到的), [3,2,4]1的左子树, [6,5,7]1的右子树。同时递归遍历 [3,2,4]序列, [6,5,7]序列。这两个序列中同时根据后序遍历来找到根节点,在中序遍历中根节点的左边的序列就是根节点的左子树,右边的序列就是根节点的右子树。
  知道这些原理,写代码相对来说,就简单的很多。

3.代码

   private int index = 0;
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        if(inorder.length == 0 || postorder.length == 0) {
            return null;
        }
        index = postorder.length - 1;
        return createBST(inorder, postorder, 0, postorder.length - 1);
    }
    private TreeNode createBST(int[] inorder, int [] postorder,int start, int end) {
        //找到在后序遍历序列中找到根节点
        int val = postorder[index];
        int i = 0;
        for(i = 0; i < end; i++) {
            //在中序遍历中,找到根节点的位置
            if(inorder[i] == val) {
                break;
            }
        }
        //构造根节点
        TreeNode node = new TreeNode(val);
        //如果end大于等于i + 1,表示还有右子树
        if(end >= i + 1) {
            //在后序遍历中,根节点的左移
            --index;
            node.right = createBST(inorder, postorder, i + 1, end);
        }
        //如果start 小于等于 i- 1,表示还有左子树
        if(start <= i - 1) {
            --index;
            node.left = createBST(inorder, postorder, start, i - 1);
        }
        return node;
    }

你可能感兴趣的:(Java 算法-中序遍历和后序遍历构造二叉树)