题意:
解题思路:
思路:
递归(dfs):创建每个节点需要的时间是 O(1),所以总时间复杂度是 O(n)
1. 先利用后序遍历找根节点:后序遍历的最后一个数,就是根节点的值;
2. 在中序遍历中找到根节点的位置 k,则 k 左边是左子树的中序遍历,右边是右子树的中序遍历;
3. 假设左子树的中序遍历的长度是 l,则在后序遍历中,前 l 个数就是左子树的后序遍历,接下来的数除了最后一个,就是右子树的后序遍历;
4. 有了左右子树的后序遍历和中序遍历,我们可以先递归创建出左右子树,然后再创建根节点;
PHP代码实现:
class Solution {
/**
* @param Integer[] $inorder
* @param Integer[] $postorder
* @return TreeNode
*/
function buildTree($inorder, $postorder) {
if (!$postorder) return null;
$x = array_pop($postorder);
$node = new TreeNode($x);
$key = array_search($x, $inorder);
$node->left = $this->buildTree(array_slice($inorder, 0, $key), array_slice($postorder, 0, $key));
$node->right = $this->buildTree(array_slice($inorder, $key + 1), array_slice($postorder, $key));
return $node;
}
GO代码实现:
/**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func buildTree(inorder []int, postorder []int) *TreeNode {
length := len(postorder)
if length == 0 {
return nil
}
root := &TreeNode {
Val: postorder[length-1],
}
index := 0
for i, value := range inorder {
if value == root.Val {
index = i
break
}
}
root.Left = buildTree(inorder[:index], postorder[:index])
root.Right = buildTree(inorder[index+1:], postorder[index:length-1])
return root
}