几种树的判定

1.二叉搜索树的判定(可以按中序遍历,看是否是递增序列或递减)

思路:运用递归的思想。

先判断左子树是否是二叉搜索树,如果不是返回false;

如果是再判断当前左子树最后打印的值是否小于根节点,如果不是则返回false,;如果是,则把当前head的值赋给prevalue;

最后返回判断右子树是否为二叉搜索树的结果。

public static int prevalue =Integer.MIN_vALUE;

public static boolean isBTS( Node head) {
if(head==null)
return true;
}
boolean isLeftBst=isBFS(head.left);
if(!isLeftBst)
return false;
}
if (head.value<=prevalue)
return false;
else 
prevalue=head.value;
return isBFS(head.right);
}

2.完全二叉树的判定

思路:按层序遍历。

条件一:如果 有结点 有右孩子没有左孩子,返回false;

条件二:在不违反条件一的情况下,如果遇到第一个左右孩子不双全的情况下,接下来遇到的所有结点都必须是叶子结点。

public static boolean isCBT(Node head){
if (head ==null){
return true;
}
LinkedList<Node> queue=new LinkedList<>();
//判断是否遇到左右不双全的结点
boolean leaf=false;//一开始没遇到此情况,就是为false
Node l=null;
Node r=null;
queue.add(head):
while(!queue.isEmpty()) {
head=queue.poll();
l=head.left;
r=head.right;
if(
(leaf&&(l!=null || r!=null))//如果遇到不双全结点,又发现当前结点有孩子
         ||
(l==null && r==null)
)
return false;
if(l!=null)
queue.add(l);
if(r!=null)
queue.add(r);
if(l==null || r==null)
leaf=true;
}
return true;
}

3.平衡二叉树的判定

思路:递归思想

一棵树是平衡二叉树,则左右子树都是平衡二叉树,|左右子树高度差|≤1

首先需要判定左右子树是否是平衡二叉树

其次需要左右子树高度

public static boolean isBalanced(Node head){
return process (head).isBalanced;
}
public static class ReturnType{
public boolean isBalanced;
public int height;

public ReturnType(Boolean isB,is hei) {
isBalanced =isB;
height=hei;
}
}


public static ReturnType process (Node x) {
if(x==null)
return new ReturnType(true,0);

//返回左右子树的两个信息(是否是平衡二叉树,两子树高度)
ReturnType leftData=process(x.left);
ReturnType rightData=process(x.right);

int height=Math.max(leftData.height,rightData.height)+1; //整棵树的高度
boolean isBalanced=leftData.isBalanced && rightData.isBalanced && Math.abs(leftData.height-rightData.height)<2;  //判断是否是平衡树,三个条件都满足时成立
return new ReturnType(isBalanced,height);
}

4.满二叉树的判定

思路:高度和结点个数是否满足 n=2的h次方-1

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小陶想要有学上

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值