牛客刷题——判断二叉树是不是完全二叉树和二叉搜索树

题目:给定一棵二叉树,已经其中没有重复值的节点,请判断该二叉树是否为搜索二叉树和完全二叉树。

 这道题目实际上就是两个问题的简单组合,直接使用两个函数分别去判断一下即可。

首先说一下二叉搜索树的判断,根据二叉搜索树的规则,左孩子 <  根节点 < 右孩子。所以只需要从上往下进行判断,是否符合这个规律,一旦不符合就 return false,否则去判断左右子树是不是也符合这个规律。

完全二叉树的话,是除了最后一层,其他的层都不会出现空节点。利用这个性质的话,对树进行层次遍历,一旦遇到空节点,判断剩余的节点是不是都是空节点,一旦出现空节点,那么说明不是完全二叉树,否则是完全二叉树。

完整代码如下:

public boolean[] judgeIt (TreeNode root) {
        // write code here
		boolean[] res = new boolean[2];
		res[0] = isSearchTree(root);
		res[1] = isCompeleteTree(root);
		return res;
    }
	//完全二叉树 除了最后一行都是有左右孩子的
	public boolean isCompeleteTree(TreeNode root) {
		Queue<TreeNode> pre = new LinkedList<>();
		pre.offer(root);
		while(!pre.isEmpty()) {
			TreeNode now = pre.poll();
			if(now==null) {
				while(!pre.isEmpty()) {
					TreeNode tempNow = pre.poll();
					if(tempNow!=null) {
						return false;
					}
				}
			}else {
				pre.offer(now.left);
				pre.offer(now.right);
			}
		}
		return true;
	}
	//二叉搜索树  根节点大于左孩子 小于左孩子
	public boolean isSearchTree(TreeNode root) {
		if(root==null) {
			return true;
		}
		int left = Integer.MIN_VALUE;
		int right = Integer.MAX_VALUE;
		
		if(root.left!=null) {
			left = root.left.val;
		}
		if(root.right!=null) {
			right = root.right.val;
		}
		if(left<root.val&&right>root.val) {
			return isSearchTree(root.left)&&isSearchTree(root.right);
		}else {
			return false;
		}
		
	}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值