【剑指offer】面试题55(2):平衡二叉树
来源:互联网 发布:粒子群算法缺点 编辑:程序博客网 时间:2024/05/22 06:39
题目
输入一棵二叉树的根节点,判断该树是不是平衡二叉树。
如果某二叉树中的任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。
思路
我们用后序遍历的方式遍历二叉树的每个节点,那么在遍历到一个节点之前我们就已经遍历了它的左、右子树。
只要在遍历每个节点的时候记录它的深度,我们就可以一边遍历一边判断每个节点是不是平衡的。
ps:根节点为null时是平衡二叉树
代码
/** * 题目: * 输入一棵二叉树的根节点,判断该树是不是平衡二叉树。 * 如果某二叉树中的任意节点的左、右子树的深度相差不超过1,那么它就是一棵平衡二叉树。 * * ps:根节点为null时返回true * * @author peige */public class _55_02_BalancedBinaryTree { public static class TreeNode { public int val = 0; public TreeNode left = null; public TreeNode right = null; public TreeNode(int val) { this.val = val; } } public boolean IsBalanced_Solution(TreeNode root) { if(root == null) return true; int res = treeDepth(root); if(res == -1) return false; return true; } /** * 一旦出现不平衡的节点,开始递归返回-1 */ public int treeDepth(TreeNode root) { if(root == null) return 0; int leftDepth = treeDepth(root.left); if(leftDepth == -1) return -1; int rightDepth = treeDepth(root.right); if(rightDepth == -1) return -1; // 该节点是否平衡 if(leftDepth - rightDepth > 1 || leftDepth - rightDepth < -1) return -1; // 加上根节点的长度(后序遍历) return leftDepth > rightDepth ? leftDepth + 1: rightDepth + 1; }}
测试
public class _55_02_Test { public static void main(String[] args) { test1(); test2(); test3(); test4(); } /** * 功能测试 * 树1: * 1 * / \ * 2 3 * / \ / \ * 4 5 6 7 * / * 8 * * 树2: * 1 * / \ * 2 3 * / \ / \ * 4 5 6 7 * / / \ * 8 9 10 * \ * 11 * */ private static void test1() { TreeNode node1 = new TreeNode(1); TreeNode node2 = new TreeNode(2); TreeNode node3 = new TreeNode(3); TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(5); TreeNode node6 = new TreeNode(6); TreeNode node7 = new TreeNode(7); TreeNode node8 = new TreeNode(8); node1.left = node2; node1.right = node3; node2.left = node4; node2.right = node5; node3.left = node6; node3.right = node7; node4.left = node8; boolean b = new _55_02_BalancedBinaryTree().IsBalanced_Solution(node1); MyTest.equal(b, true); TreeNode node9 = new TreeNode(9); TreeNode node10 = new TreeNode(10); TreeNode node11 = new TreeNode(11); node5.left = node9; node5.right = node10; node9.right = node11; b = new _55_02_BalancedBinaryTree().IsBalanced_Solution(node1); MyTest.equal(b, false); } private static void test2() { TreeNode node1 = new TreeNode(1); _55_02_BalancedBinaryTree bbt = new _55_02_BalancedBinaryTree(); boolean b = bbt.IsBalanced_Solution(node1); MyTest.equal(b, true); } private static void test3() { _55_02_BalancedBinaryTree bbt = new _55_02_BalancedBinaryTree(); boolean b = bbt.IsBalanced_Solution(null); MyTest.equal(b, false); } /** * 提交的时候没过的case: * 1 * / * 2 * / * 3 * / * 4 * / * 5 */ private static void test4() { TreeNode node1 = new TreeNode(1); TreeNode node2 = new TreeNode(2); TreeNode node3 = new TreeNode(3); TreeNode node4 = new TreeNode(4); TreeNode node5 = new TreeNode(5); node1.left = node2; node2.left = node3; node3.left = node4; node4.left = node5; _55_02_BalancedBinaryTree bbt = new _55_02_BalancedBinaryTree(); boolean b =bbt.IsBalanced_Solution(node1); MyTest.equal(b, false); }}
阅读全文
0 0
- 【剑指offer】面试题55(2):平衡二叉树
- 《剑指Offer》面试题:平衡二叉树
- 【剑指Offer】:面试题39:平衡二叉树
- 剑指Offer----面试题39(2):判断是否为平衡二叉树
- 剑指Offer系列-面试题39-2:判断一棵树是否为平衡二叉树
- 剑指offer 面试题39 求二叉树深度|判断是否为平衡二叉树
- 剑指offer 面试题39—二叉树的深度vs平衡二叉树判断
- 剑指offer面试题之判断一颗二叉树是不是平衡二叉树
- 剑指offer面试题39:二叉树深度以及判断平衡二叉树
- 剑指offer面试题39:二叉树深度与平衡二叉树
- 剑指offer面试题 39 二叉树的深度和判断是不是平衡树
- 剑指 offer代码解析——面试题39判断平衡二叉树
- 剑指 offer代码解析——面试题39判断平衡二叉树(高效方法)
- 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解
- 【面试题】剑指Offer-39-求二叉树的深度和判断一颗树是否为平衡二叉树
- 《剑指Offer》面试题-重建二叉树
- 剑指Offer面试题39二叉树的深度(以及判断平衡二叉树),面试题40数组中只出现一次的数字
- 剑指offer 面试题6 重建二叉树2
- 快速获取Jenkins上build
- AOP-方法顾问增强
- MYSQL修改密码的方法
- rot13初学者和python的实现
- Java枚举抽象方法实战
- 【剑指offer】面试题55(2):平衡二叉树
- Qt QChart 图形可视化
- Substring Anagrams
- 基本的Unix Command
- H5数据可视化:Canvas和SVG
- 链表(第一次错误尝试)
- 虚拟机上的两台ubuntu 怎么ping通
- Codeforces
- hibernate入门(三)Criteria条件查询