数据结构与算法之判断一棵树是否为搜索二叉树、判断一棵树是否是完全二叉树
目录
1. 判断一棵树是否为搜索二叉树
- 概念:搜索树就是中序遍历的结果是升序,就是搜索二叉树。如下图
- 我们可以改中序遍历非递归版,在打印时机换成比较。即如代码为中序遍历非递归版
public static void inOrderUnRecur(Node head) {
System.out.print("in-order: ");
if (head != null) {
Stack<Node> stack = new Stack<Node>();
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.left;
} else {
head = stack.pop();
System.out.print(head.value + " ");
head = head.right;
}
}
}
System.out.println();
}
我们设置一个变量记录当前值,和后一个需要打印的值比较,如果前一个值大于后一个值,即不是搜索二叉树,则返回false。改后的搜索二叉树代码为:
public static boolean isBST1(Node head) {
if (head != null) {
Stack<Node> stack = new Stack<>();
int pre = 0;
while (!stack.isEmpty() || head != null) {
if (head != null) {
stack.push(head);
head = head.left;
} else {
head = stack.pop();
if (pre<=head.value){
pre = head.value;
}else {
return false;
}
head = head.right;
}
}
}
return true;
}
另外一种搜索二叉树的代码
public static boolean isBST2(Node head) {
if (head == null) {
return true;
}
boolean res = true;
Node pre = null;
Node cur1 = head;
Node cur2 = null;
while (cur1 != null) {
cur2 = cur1.left;
if (cur2 != null) {
while (cur2.right != null && cur2.right != cur1) {
cur2 = cur2.right;
}
if (cur2.right == null) {
cur2.right = cur1;
cur1 = cur1.left;
continue;
} else {
cur2.right = null;
}
}
if (pre != null && pre.value > cur1.value) {
res = false;
}
pre = cur1;
cur1 = cur1.right;
}
return res;
}
2. 判断一棵树是否是完全二叉树
-
思路
- 如果有右孩子,没有左孩子,那肯定不是完全二叉树
- 当第一次发现左右两个孩子不是双全的时候,后面遍历到的节点全部都是叶节点,否则返回false
-
流程
- 判断head是否为null,如果为null返回true,否则创建一个队列和创建一个布尔值leaf,表示判断是否开启叶子阶段
- 当队列不为null时,从队列弹出一个数,然后获取左右节点。
- 判断:如果左孩子为null,右孩子不为null,或者开启叶子判断并且左孩子节点或者右孩子节点不为null,则返回false。
- 如果左节点不为null,加入队列。如果右节点不为null,加入队列。
- 如果左节点为null或者右节点为null,则开启叶子判断。
-
代码实现
public static boolean isCBT(Node head) {
if (head == null) {
return true;
}
Queue<Node> queue = new LinkedList<Node>();
boolean leaf = false;
Node l = null;
Node r = null;
queue.offer(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.offer(l);
}
if (r != null) {
queue.offer(r);
}
if (l == null || r == null) {
leaf = true;
}
}
return true;
}