迭代版
/**
* Definition for a binary tree node.
* class TreeNode {
* public $val = null;
* public $left = null;
* public $right = null;
* function __construct($val = 0, $left = null, $right = null) {
* $this->val = $val;
* $this->left = $left;
* $this->right = $right;
* }
* }
*/
class Solution {
/**
* @param Integer[] $preorder
* @param Integer[] $inorder
* @return TreeNode
*/
function buildTree($preorder, $inorder) {
$lenPre = count($preorder);
$lenIn = count($inorder);
if ($lenPre == 0 || $lenIn == 0 || $lenPre != $lenIn) {
return null;
}
$stack = new SplStack();
$inorderIndex = 0;
$root = new TreeNode($preorder[0]);
$stack->push($root);
for($i=1; $i<$lenPre; $i++) {
$preVal = $preorder[$i];
$top = $stack->top();
if($top->val != $inorder[$inorderIndex]) {
$node = new TreeNode($preVal);
$top->left = $node;
$stack->push($node);
continue;
}
$curNode = null;
while(!$stack->isEmpty() && $stack->top()->val == $inorder[$inorderIndex]) {
$inorderIndex++;
$curNode = $stack->pop();
}
$node = new TreeNode($preVal);
$curNode->right = $node;
$stack->push($node);
}
return $root;
}
}
运行结果: