?2.解答
1)递归算法: --思路: 比较左子树中的值比根节点的值不小,或 右子树中的值比根节点中的值不大,则返回 false --代码实现
$this->doCheck($root, PHP_INT_MIN, PHP_INT_MAX);
?/**
? ? * 递归(recursion)的解决方案
? ? * php中最小数值和最大数值怎么表示?PHP_INT_MAXPHP_INT_MIN
? ? ?*/
? ? function doCheck($root, $lowVal, $highVal) {
? ? ? ? if($root === null){
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? // 适当的调试,帮助理解和编码
? ? ? ? //var_dump("01", $root->val, $lowVal, $highVal, "\n\n");
? ? ? ? // 一定注意判断下 $lowVal 和 $highVal 为 null的情况
? ? ? ? if(($root->val <= $lowVal)
? ? ? ? || ($root->val >= $highVal)){
? ? ? ? ? ? return false;
? ? ? ? }
? ? ? ? // 注意是取 逻辑的与
? ? ? ? return $this->doCheck($root->left, $lowVal, $root->val)
? ? ? ? ?&& $this->doCheck($root->right, $root->val, $highVal);
? ? }
-- 注意点: ① php的最小值,最大值分别为 PHP_INT_MIN 和 PHP_INT_MAX ② php是弱语言,里边的 null == 0 会返回 true ③ 最后的 返回表达式里,上下边界的取值 return this->doCheck(this?>doCheck(root->left, $lowVal, $root->val) && this->doCheck(this?>doCheck(root->right, $root->val, $highVal);
2)迭代算法 --思路: 使用二叉树的中序遍历,因为是 二叉搜索树,中序遍历的结果应该是一个 升序序列。 -- 代码实现:
/**
? ? * 迭代(iteration)的解决方案: 中序遍历
? ? */
? ? function dieDaiCheck($root){
? ? ? ? if($root === null){
? ? ? ? ? ? return true;
? ? ? ? }
? ? ? ? // 栈数组
? ? ? ? $stack = array();
? ? ? ? $inOrder = null;
? ? ? ? // test?
? ? ? ? $loop = 0;
? ? ? ? while(!empty($stack) || $root != null){
? ? ? ? ? ? // test?
? ? ? ? ? ? $loop ++;
? ? ? ? ? ? while($root !== null){
? ? ? ? ? ? ? ? // 这里放置的是一个对象
? ? ? ? ? ? ? ? $stack[] = $root;
? ? ? ? ? ? ? ? $root = $root->left;
? ? ? ? ? ? }
? ? ? ? ? ? // 出栈
? ? ? ? ? ? $root = array_pop($stack);
? ? ? ? ? ? // 注意php是弱语言, 0 == null 会返回真
? ? ? ? ? ? if($inOrder !== null && $root->val <= $inOrder){
? ? ? ? ? ? ? ? return false;
? ? ? ? ? ? }
? ? ? ? ? ? $inOrder = $root->val;
? ? ? ? ? ? $root = $root->right;
? ? ? ? }
? ? ? ? return true;
? ? }
-- 注意点: ① 中序遍历的迭代算法中,使用数据结构 stack来实现,java中建议是 DeQueue,不建议已经过时的 Stack, php中数组表达一切,只是注意 array_pop代表弹栈操作 ②php弱语言的性质还要注意 ③ 二叉树中序遍历的模板注意背诵,左 * 右
|