首页 > 试题广场 >

判断一棵二叉树是否为搜索二叉树和完全二叉树

[编程题]判断一棵二叉树是否为搜索二叉树和完全二叉树
  • 热度指数:52276 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
给定一棵二叉树,已知其中的节点没有重复值,请判断该二叉树是否为搜索二叉树和完全二叉树。
输出描述:分别输出是否为搜索二叉树、完全二叉树。


数据范围:二叉树节点数满足 ,二叉树上的值满足
要求:空间复杂度 ,时间复杂度

注意:空子树我们认为同时符合搜索二叉树和完全二叉树。
示例1

输入

{2,1,3}

输出

[true,true]
示例2

输入

{1,#,2}

输出

[true,false]

说明

由于节点的右儿子大于根节点,无左子树,所以是搜索二叉树但不是完全二叉树     
示例3

输入

{}

输出

[true,true]

说明:本题目包含复杂数据结构TreeNode,点此查看相关信息
function judgeIt(root) {
// write code here
return [isSearchTree(root, Number.MIN_SAFE_INTEGER, Number.MAX_SAFE_INTEGER), isFullTree(root)];
}
function isSearchTree(root, left, right) {
if (!root) return true;
if (root.val <= left || root.val >= right) return false;
return isSearchTree(root.left, left, root.val) && isSearchTree(root.right, root.val, right);
}
function isFullTree(root) {
// 递归结束条件:当前节点为空时返回 true
if (!root) return true; // 空树也被认为是完全二叉树

let queue = [root], flag = false;
while (queue.length > 0) {
const node = queue.shift();

const left = node.left;
const right = node.right;
if ((flag && !(!left && !right)) || (!left && right)) return false;
if (left) queue.push(left);
if (right) queue.push(right);
if (!left || !right) flag = true;
}
return true;
}
编辑于 2024-03-07 10:26:02 回复(0)

问题信息

难度:
1条回答 6879浏览

热门推荐

通过挑战的用户

查看代码