Java 剑指offer(55-2) 平衡二叉树
Posted 华仔要长胖
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java 剑指offer(55-2) 平衡二叉树相关的知识,希望对你有一定的参考价值。
本文参考自《剑指offer》一书,代码采用Java语言。
题目
输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路
在(55-1) 二叉树的深度基础上修改:计算树的深度,树的深度=max(左子树深度,右子树深度)+1。在遍历过程中,判断左右子树深度相差是否超过1,如果不平衡,则令树的深度=-1,用来表示树不平衡。最终根据树的深度是否等于-1来确定是否为平衡树。
测试算例
1.功能测试(左斜树、右斜树、平衡或者不平衡树)
3.特殊测试(一个结点,null)
Java代码
//题目:输入一棵二叉树的根结点,判断该树是不是平衡二叉树。如果某二叉树中 //任意结点的左右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 public class BalancedBinaryTree { public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val; } } public boolean IsBalanced_Solution(TreeNode root) { return getDepth(root)!=-1; } public int getDepth(TreeNode root) { if(root==null) return 0; int left=getDepth(root.left); if(left==-1) return -1; int right=getDepth(root.right); if(right==-1) return -1; return Math.abs(left - right) > 1 ? -1 : 1 + Math.max(left, right); } /* //自己开始想的方法,但是一定要把树给遍历完才行;上面的方法实现了剪枝 boolean isBalanced=true; public boolean IsBalanced_Solution(TreeNode root) { TreeDepth(root); return isBalanced; } public int TreeDepth(TreeNode root) { if(root==null) return 0; int left=TreeDepth(root.left); int right=TreeDepth(root.right); if(left-right>1 || right-left>1) isBalanced=false; return Math.max(left+1,right+1); } */ }
收获
1.在判断出树不平衡后,进行剪枝(即代码中直接返回-1,不再对其他子树进行判断),以提高效率。
以上是关于Java 剑指offer(55-2) 平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章