左神直通BAT之判断一个树是否是平衡二叉树

Posted 程序员弹药库

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了左神直通BAT之判断一个树是否是平衡二叉树相关的知识,希望对你有一定的参考价值。

判断一个树是否是平衡二叉树

平衡二叉树的定义:当二叉树的任意一棵子树的左子树的高度和右子树的高度相差不超过1时,该二叉树为平衡二叉树。

根据定义可知,要确认一个二叉树是否是平衡二叉树势必要遍历所有结点。而遍历到每个结点时,要想知道以该结点为根结点的子树是否是平衡二叉树,我们要收集两个信息:

  1. 该结点的左子树、右子树是否是平衡二叉树

  2. 左右子树的高度分别是多少,相差是否超过1

那么我们来到某个结点时(子过程),我们需要向上层(父过程)返回的信息就是该结点为根结点的树是否是平衡二叉树以及该结点的高度,这样的话,父过程就能继续向上层返回应该收集的信息。

 
   
   
 
  1. package top.zhenganwen.algorithmdemo.recursive;

  2. /**

  3. * 判断是否为平衡二叉树

  4. */

  5. public class IsBalanceBTree {

  6. public static class Node{

  7. int data;

  8. Node left;

  9. Node right;

  10. public Node(int data) {

  11. this.data = data;

  12. }

  13. }

  14. /**

  15. * 遍历时,来到某个结点需要收集的信息

  16. * 1、以该结点为根节点的树是否是平衡二叉树

  17. * 2、该结点的高度

  18. */

  19. public static class ReturnData {

  20. public boolean isBalanced;

  21. public int height;

  22. public ReturnData(boolean isBalanced, int height) {

  23. this.isBalanced = isBalanced;

  24. this.height = height;

  25. }

  26. }

  27. public static ReturnData isBalancedBinaryTree(Node node){

  28. if (node == null) {

  29. return new ReturnData(true, 0);

  30. }

  31. ReturnData leftData = isBalancedBinaryTree(node.left);

  32. if (leftData.isBalanced == false) {

  33. //只要有一棵子树不是平衡二叉树,则会一路返回false,该树的高度自然不必收集了

  34. return new ReturnData(false, 0);

  35. }

  36. ReturnData rightDta = isBalancedBinaryTree(node.right);

  37. if (rightDta.isBalanced == false) {

  38. return new ReturnData(false, 0);

  39. }

  40. //返回该层收集的结果

  41. if (Math.abs(leftData.height - rightDta.height) > 1) {

  42. return new ReturnData(false, 0);

  43. }

  44. //若是平衡二叉树,树高等于左右子树较高的那个加1

  45. return new ReturnData(true, Math.max(leftData.height, rightDta.height) + 1);

  46. }

  47. public static void main(String[] args) {

  48. Node root = new Node(1);

  49. root.left = new Node(2);

  50. root.left.left = new Node(4);

  51. root.right = new Node(3);

  52. root.right.right = new Node(5);

  53. root.right.right.right = new Node(6);

  54. System.out.println(isBalancedBinaryTree(root).isBalanced); //false

  55. }

  56. }

递归很好用,该题中的递归用法也是一种经典用法,可以高度套路:

  1. 分析问题的解决需要哪些步骤(这里是遍历每个结点,确认每个结点为根节点的子树是否为平衡二叉树)

  2. 确定递归:父问题是否和子问题相同

  3. 子过程要收集哪些信息

  4. 本次递归如何利用子过程返回的信息得到本过程要返回的信息

  5. basecase

出自:http://www.zhenganwen.top

已获授权


作者是前腾讯员工/现创业公司员工,致力于分享leetcode/剑指offer/算法题解/互联网时事/编程资源,觉得不错关注转发一下。


以上是关于左神直通BAT之判断一个树是否是平衡二叉树的主要内容,如果未能解决你的问题,请参考以下文章

左神直通BAT算法之堆排序

2021-04-13:判断二叉树是否是平衡二叉树?

判断一颗二叉树是否为二叉平衡树 python 代码

判断二叉树是否平衡二叉树

《剑指offer》:[39-1]判断是否为平衡二叉树

判断一个二叉树是否是平衡二叉树