标签:
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