二叉树 平衡二叉树110
2024-03-26 本文已影响0人
宗驴
需求
给定一个二叉树,判断它是否是
平衡二叉树
示例 1:
二叉树
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
二叉树
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
概念:
平衡二叉树: 二叉树任何一个节点的左右子树的高度差小于等于一。
思路
递归法:
根据平衡二叉树的概念,对树进行遍历,如果左右子节点高度>1 说明不是平成二叉树。
层遍历法:
上面我们实现了二叉树最小高度。那么我们在找出最大高度,只要差值>1说明不是平衡二叉树。
/**
* 110. 平衡二叉树
*/
public class IsBalanced110 {
public boolean isBalanced(TreeNode root) {
int high = balaced(root);
return high == -1 ? false : true;
}
/**
* 求高度均使用递归后续遍历
* 求深度均使用递归前序遍历
*/
public int balaced(TreeNode node) {
int result = 0;
// 任一节点左右子树高度差<=1
if (node == null) return 0;
int leftHigh = balaced(node.left);// 左
int rightHigh = balaced(node.right);// 右
// 子树返回已不是平衡平衡二叉树直接返回
if (leftHigh == -1 || rightHigh == -1) return -1;
if (Math.abs(leftHigh - rightHigh) > 1) return -1;
result = 1 + Math.max(leftHigh, rightHigh);// 中
return result;
}
/**
* 层序遍历,广度遍历
*/
public boolean isBalancedGd(TreeNode root) {
if (root == null) return true;
int minHigh = 0;
int maxHigh = 0;
boolean isminHigh = true;
Deque<TreeNode> deque = new LinkedList();
deque.offer(root);
while (!deque.isEmpty()) {
int size = deque.size();
if (isminHigh) minHigh++;
maxHigh++;
while (size-- > 0) {
TreeNode node = deque.pop();
if (node.left != null) deque.offer(node.left);
if (node.right != null) deque.offer(node.right);
// 找到最小高度,停止最小高度赋值
if (node.left == null && node.right == null) isminHigh = false;
}
}
return Math.abs(minHigh - maxHigh) <= 1;
}
}
验证结果
验证结果