给出一棵树的中序遍历和后序遍历,请构造这颗二叉树
注意: 保证给出的树中不存在重复的节点
Given inorder and postorder traversal of a tree, construct the binary tree.
Note: You may assume that duplicates do not exist in the tree.
<?php
class Node{
public $left = null;
public $right = null;
public $val;
public function __construct($val) {
$this->val = $val;
}
}
function buildTree($arrInOrder, $arrPostOrder) {
if (empty($arrInOrder) || empty($arrPostOrder)) {
return null;
}
$node = getNode($arrInOrder, 0, count($arrInOrder) - 1, $arrPostOrder, 0, count($arrPostOrder) - 1);
return $node;
}
function getNode($arrInOrder, $x1, $y1, $arrPostOrder, $x2, $y2) {
print "$x1 $y1 $x2 $y2\n";
if ($x1 > $y1 || $x2 > $y2 || $y1 > count($arrInOrder) || $y2 > count($arrPostOrder)) {
return;
}
$node = new Node($arrPostOrder[$y2]);
for ($i = $x1; $i <= $y1; $i ++) {
if ($arrPostOrder[$y2] == $arrInOrder[$i]) {
//中序遍历的位置$i,可以确定后序遍历的便宜量为$i - $x1
$node->left = getNode($arrInOrder, $x1, $i - 1, $arrPostOrder, $x2, $x2 + $i - $x1 - 1);
$node->right = getNode($arrInOrder, $i + 1, $y1, $arrPostOrder, $x2 + $i - $x1 , $y2 - 1);
break;
}
}
return $node;
}
$arrInOrder = [4,2,6,1,3,5];
$arrPostOrder = [4,6,2,5,3,1];
$node = buildTree($arrInOrder, $arrPostOrder);
output($node);
function output($node) {
print $node->val."\t";
print "左".$node->left->val."右".$node->right->val."\n";
if ($node->left != null) {
output($node->left);
}
if ($node->right != null) {
output($node->right);
}
print "\n";
}