文章目录
判断一颗二叉树是否是平衡二叉树
平衡二叉树定义
平衡二叉树:
平衡二叉树也称AVL树,其任意结点左右子树的高度差小于等于1【平衡二叉树不一定是排序二叉树
】;
更多相关内容可参考:平衡二叉树详解 通俗易懂
思路
根据平衡二叉树的性质:
- 分别判断左右子树是否是平衡二叉树,如果不是,则直接返回false;
- 分别获取左右子树的高度,计算左右子树高度差,如果绝对值大于1,则返回false;
代码实现
private static class Node {
public int value;
public Node left;
public Node right;
public Node(int value) {
this.value = value;
}
}
/**
* 判断一棵树是否是平衡二叉树
*
* @param node
* @return
*/
private static boolean isBalanceTree(Node node) {
//java为值传递,基础类型不改变值
boolean[] isBalance = new boolean[1];
isBalance[0] = true;
getHeight(node, 1, isBalance);
return isBalance[0];
}
/**
* 获取某个Node结点的高度
*
* @param node 对应结点
* @param level 层级
* @param isBalance 是否平衡
* @return
*/
private static int getHeight(Node node, int level, boolean[] isBalance) {
if (node == null) {
return level;
}
//获取node结点左子树的高度
int leftHeight = getHeight(node.left, level + 1, isBalance);
//如果左子树不是平衡二叉树,返回false
if (!isBalance[0]) {
return level;
}
//获取node结点右子树的高度
int rightHeight = getHeight(node.right, level + 1, isBalance);
//如果右子树不是平衡二叉树,返回false
if (!isBalance[0]) {
return level;
}
//如果左右子树相差大于1,返回false
if (Math.abs(leftHeight - rightHeight) > 1) {
isBalance[0] = false;
}
//当前结点高度取左右子树最大的那个高度
return Math.max(leftHeight, rightHeight);
}
判断一棵二叉树是否是二叉搜索树(二叉排序树)
二叉搜索树定义
- 二叉搜索树可以为空,也可以不为空;
- 非空左子树的所有键值小于等于其根结点的值;
- 非空右子树的所有键值大于等于其根结点的值;
- 左右子树都是二叉搜索树;
思路
根据二叉排序树的性质,可以知道二叉排序树中序遍历结果是升序的
,因此可以通过中序遍历方式判断是否是升序来进行判断;
代码实现
/**
* 定义全局变量,用于记录上一个值
*/
private static int preValue = Integer.MIN_VALUE;
private static boolean isBST(Node node) {
if (node == null) {
//空二叉树也是二叉搜索树
return true;
}
//初始化设置为int最小值
preValue = Integer.MIN_VALUE;
//递归判断左子树是否是二叉搜索树
boolean isLeftBST = isBST(node.left);
if (!isLeftBST) {
return false;
}
//结点值应该大于或等于上一个结点的值
if (node.value >= preValue) {
preValue = node.value;
} else {
//不是则返回false
return false;
}
//再递归判断右子树是否是二叉搜索树
return isBST(node.right);
}
判断一颗二叉树是否是完全二叉树
完全二叉树定义
满二叉树:
在一颗二叉树中,如果每个结点都存在左子树和右子树,并且所有叶节点都在同一层上,这样的树为满二叉树。
完全二叉树:
相同深度的满二叉树的所有结点(不包含叶子)在该树上都有相应的节点(包含叶子)与之对应且所有左子树先存在,才会存在右子树,然后才会存在下层子树的情况,这样的树为完全二叉树 。
更多完全二叉树请参考:数据结构之完全二叉树
思路
根据完全二叉树的性质,采用层序遍历
方式,将结点一层层放入队列,从队列中依次取出,如果取出NULL,则跳出循环,后续再遍历队列,如果队列中存在不为NULL的结点,则说明不是完全二叉树;
代码实现
/**
* 使用层序遍历判断一颗二叉树是否是完全二叉树
*
* @return
*/
private static boolean isCBT(Node root) {
if (root == null) {
//空二叉树为完全二叉树
return true;
}
//创建一个队列
Queue<Node> queue = new LinkedList<>();
//加入头结点
queue.add(root);
while (!queue.isEmpty()) {
//从队列中取出结点,如果当前结点不为null,将左右子树加入队列,否则跳出循环
Node node = queue.poll();
if (node != null) {
queue.add(node.left);
queue.add(node.right);
} else {
break;
}
}
//再次遍历队列,如果仍存在非空结点,则非完全二叉树
while (!queue.isEmpty()) {
Node node = queue.poll();
if (node != null) {
return false;
}
}
return true;
}
图文解释
结语
如果以上文章对您有一点点帮助,希望您不要吝啬的点个赞加个关注,您每一次小小的举动都是我坚持写作的不懈动力!ღ( ´・ᴗ・` )