1 <?php 2 #通过数组判断该数组顺序输出是否是二叉树后序遍历结果 3 4 #@param a 待判断数组 5 #@param s 待判断开始部分 6 #@param e 待判断结束部分 7 function is_bst_post($a, $s, $e) { 8 if ($s == $e) { 9 return true; 10 } 11 12 #由于是后序遍历,所以根节点必然是最后一个元素 13 $root = $a[$e]; 14 #找到第一个大于等于根节点的元素 15 #如果符合bst的数组,从s到i-1,都是左子树元素,i到e-1都是右子树的元素 16 #此处规定二叉树如果有相同的元素都放在右子树 17 $i = $s; 18 while ($i < $e && $a[$i] < $root) $i++; 19 20 #分别判断左右子树是否是bst 21 #如果左子树存在,判断左子树是否是bst 22 if ($i > $s) { 23 #此处不需要判断左子树是否都小于root,因为i左边的元素都已经是小于root了 24 $result_l = is_bst_post($a, $s, $i - 1); 25 } else if ($i == $s) { #左子树不存在 26 $result_l = true; 27 } 28 29 #如果右子树存在,判断右子树是否是bst 30 if ($i < $e) { 31 #查看右子树是否所有节点均大于等于root 32 for ($j = $i; $j < $e; $j++) { 33 if ($a[$j] < $root) { 34 return false; 35 } 36 } 37 $result_r = is_bst_post($a, $i, $e - 1); 38 } else if ($i == $e) { #右子树不存在 39 $result_r = true; 40 } 41 42 return ($result_l && $result_r); 43 } 44 45 $a = array(5, 7, 6, 9, 11, 10, 8); 46 $b = array(7, 4, 6, 5); 47 $t = is_bst_post($a, 0, count($a) - 1); 48 $t2 = is_bst_post($b, 0, count($b) - 1); 49 var_dump($t, $t2); 50 ?>
bool(true) bool(false)