1.判断一个树是否完全二叉树
首先我们要知道,如果是一颗完全二叉树,那么它依照层序遍历后,只要是null节点后就不应该有非空节点。即完全二叉树存储是空节点都应该在最后。
因此,使用两个循环,第一个循环依照层序遍历,但不管该节点的左右孩子是否为空都加到队列中去,直到队首元素出现第一个空节点,跳出循环
第二个循环再检查队列中剩余节点。
- 如果剩余节点出现非空,表示该树不是完全二叉树
- 如果剩余节点为空且都为空才说这棵树是完全二叉树
代码是这样滴:)
import java.util.Queue;
class TreeNode{
int val;
TreeNode left;
TreeNode right;
}
public class isComplete {
public static boolean isComliete(TreeNode root){
if (root == null){
return true;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.add(root);
while(true){
TreeNode front = queue.poll();
if(front == null) {
break;
}
queue.add(front.left);
queue.add(front.right);
}
while(!queue.isEmpty()){ //借助队列判空方法,不可以写成queue == null
TreeNode node = queue.poll();
if (node != null) {
return false;
}
}
return true;
}
}
2.判断一棵树是否平衡二叉树
平衡二叉树通俗点说就是任意一个节点作为根节点,它的左右子树的高度都不超过1;
因为用到了左右子树,我们就想到使用递归来解决
先判断左子树是否平衡二叉树
再判断右子树是否平衡二叉树
接着判断对于根节点而言,左右子树的高度是否超过1
当然这里需要一个简单的求解高度的方法:使用递归算出左右子树的各自高度,找出较高的高度+1就是整个树的高度
这里一定要记得:
再写递归方法时千万不要展开递归的过程!!!
只需要整体把握!
代码是这样滴:)
class Node{
int val;
Node left;
Node right;
}
public class isBalanced {
public static int calaHeight(Node root){
if(root == null){
return 0;
}
int left = calaHeight(root.left);
int right = calaHeight(root.right);
int height = Math.max(right,left) + 1;
return height;
}
public static boolean isBalanced(Node root){
if(root == null){
return false;
}
boolean leftBalance = isBalanced(root.left);
if(!leftBalance){
return false;
}
boolean rightBalance = isBalanced(root.right);
if(!rightBalance){
return false;
}
int leftHeight = calaHeight(root.left);
int rightHeight = calaHeight(root.right);
int diff = leftHeight - rightHeight;
if(diff > 1||diff < -1){
return false;
}
return true;
}
}