码迷,mamicode.com
首页 > 其他好文 > 详细

Construct Binary Tree from Inorder and Postorder Traversal

时间:2015-04-26 15:00:15      阅读:116      评论:0      收藏:0      [点我收藏+]

标签:

https://leetcode.com/problems/construct-binary-tree-from-inorder-and-postorder-traversal/

Given inorder and postorder traversal of a tree, construct the binary tree.

Note:
You may assume that duplicates do not exist in the tree.

解题思路:

这道题和上一题 Construct Binary Tree from Preorder and Inorder Traversal 就很像了。

这里我们把下面二叉树的三种遍历结果的列出来,看的就比较清楚了。

                       7

                    /    \

                10        2

              /     \      /

           4        3     8

                     \     /

                     1    11

preorder:7  10  4  3  1  2  8  11

inorder:  4  10  3  1  7  11 8  2

postorder:4  1  3  10 11 8 2  7

preorder的root节点总是出现在它子树所有节点的前面,而postorder的root节点总是出现在它子树所有节点的后面。

inorder的root节点,是在左子树和右子树所有节点的中间。

这两道题的解决都是依靠这个重要的性质。

递归其实递归的就是数组的边界。这里我们总是在preorder或者postorder内找到root元素,然后在inorder中找到root的位置index,那么从inStart到index的长度就是左子树的节点数量,从index到inEnd的长度就是右子树的节点数量。然后,再去preorder或者postorder中,确定左子树和右子树节点的范围。

再对左子树和右子树遍历。

/**
 * Definition for binary tree
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode(int x) { val = x; }
 * }
 */
public class Solution {
    public TreeNode buildTree(int[] inorder, int[] postorder) {
        return helper(inorder, postorder, 0, inorder.length - 1, 0, postorder.length - 1);
    }
    
    public TreeNode helper( int[] inorder, int[] postorder, int inStart, int inEnd, int postStart, int postEnd) {
        if(postStart > postEnd || inStart > inEnd) {
            return null;
        }
        TreeNode node = new TreeNode(postorder[postEnd]);
        int index = 0;
        for(int i = inStart; i <= inEnd; i++){
            if(inorder[i] == postorder[postEnd]) {
                index = i;
                break;
            }
        }
        node.left = helper(inorder, postorder, inStart, index - 1, postStart, postStart + (index - inStart) - 1);
        node.right = helper(inorder, postorder, index + 1, inEnd, postEnd - (inEnd - index), postEnd - 1);
        return node;
    }
}

 

Construct Binary Tree from Inorder and Postorder Traversal

标签:

原文地址:http://www.cnblogs.com/NickyYe/p/4456946.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!