完全二叉树定义: 每一层都是满的,最后一层如果不满,也是从左到右依次排列
宽度优先遍历
1) 任一节点,有右孩子,没左孩子, return false;
2) 在1不违规的情况下,遇到第一个左右俩孩子不双全的情况。接下来所有的节点必须是叶节点
| public static boolean isCBT(Node head) { |
| if (head == null) { |
| return true; |
| } |
| LinkedList<Node> queue = new LinkedList<>(); |
| Node cur = null; |
| Node left = null; |
| Node right = null; |
| |
| |
| boolean first_leaf = false; |
| |
| queue.add(head); |
| while (!queue.isEmpty()) { |
| cur = queue.poll(); |
| |
| left = cur.left; |
| right = cur.right; |
| |
| if (left == null && right != null) { |
| |
| return false; |
| } |
| if (first_leaf && (left != null || right != null)) { |
| |
| |
| return false; |
| } |
| |
| if (left != null) { |
| queue.add(left); |
| } |
| if (right != null) { |
| queue.add(right); |
| } |
| |
| if (left == null || right == null) { |
| |
| first_leaf = true; |
| } |
| |
| } |
| return true; |
| } |
满二叉树:
最大深度:L 节点数 N
必须满足 : N = 2^L - 1
树形DP
| public static class FullType{ |
| public int height; |
| public int nodes; |
| public FullType(int height, int nodes){ |
| |
| this.height = height; |
| this.nodes = nodes; |
| } |
| } |
| public static FullType processFullBT(Node node){ |
| if(node == null){ |
| |
| return new FullType(0, 0); |
| } |
| |
| |
| FullType leftData = processFullBT(node.left); |
| |
| FullType rightData = processFullBT(node.right); |
| |
| |
| int height = Math.max(leftData.height, rightData.height) + 1; |
| int nodes = leftData.nodes + rightData.nodes + 1; |
| |
| return new FullType(height, nodes); |
| |
| } |
| public static boolean isFullBT(Node head){ |
| FullType result = processFullBT(head); |
| return result.nodes == (1<< result.height - 1); |
| |
| } |
平衡二叉树
对于任何一个子树,左树的高度和右树的高度差不超过1
左子树是平衡二叉树, 右子树是平衡二叉树
|左高 - 右高| <= 1
需要子树的高度 和 是否为平衡二叉树 俩个信息
| public static class ReturnType { |
| |
| public boolean isBalanced; |
| public int height; |
| |
| public ReturnType(boolean isBalanced, int height){ |
| this.isBalanced = isBalanced; |
| this.height = height; |
| } |
| } |
| public static ReturnType processIsBalanced(Node node){ |
| if(node == null){ |
| |
| return new ReturnType(true, 0); |
| |
| } |
| |
| |
| ReturnType leftData = processIsBalanced(node.left); |
| |
| |
| ReturnType rightData = processIsBalanced(node.right); |
| |
| |
| |
| int height = Math.max(leftData.height, rightData.height) + 1 ; |
| |
| |
| boolean isBalanced = leftData.isBalanced && rightData.isBalanced && |
| Math.abs(leftData.height - rightData.height) <=1; |
| |
| |
| return new ReturnType(isBalanced, height); |
| } |
| public static boolean isBalanced(Node head){ |
| return processIsBalanced(head).isBalanced; |
| } |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统