从零学算法110

110.给定一个二叉树,判断它是否是高度平衡的二叉树。
本题中,一棵高度平衡二叉树定义为:
一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1 。
示例 1:
输入:root = [3,9,20,null,null,15,7]
输出:true
示例 2:
输入:root = [1,2,2,3,3,null,null,4,4]
输出:false
示例 3:
输入:root = []
输出:true

  • 他人解法:对于每棵子树来说,它都应该是一颗平衡树,那么就自底向上开始判断,只要有一颗不是,就直接返回结果。巧妙的地方来了,我们并不直接返回布尔值,而是返回当前数的高度,我们知道一棵树的高度是 max(左子树高度,右子树高度)+1,我们先得到左右子树高度,因为要平衡,所以我们判断如果左右子树高度差小于 2 ,那么返回树的高度,否则就返回 -1,代表当前子树不平衡。
  •   public boolean isBalanced(TreeNode root) {
          return recur(root)!=-1;
      }
      public int recur(TreeNode root){
          if(root==null)return 0;
          // 得到左子树高度
          int left = recur(root.left);
          // 左子树不平衡那就不用继续看了,直接返回 -1
          if(left == -1)return -1;
          // 得到右子树高度
          int right = recur(root.right);
           // 右子树不平衡那就不用继续看了,直接返回 -1
          if(right == -1)return -1;
          // 否则就看看左右子树高度差是否小于 2
          return Math.abs(left-right)<2?Math.max(left,right)+1:-1;
      }
    
  • 根据以上代码左右根这种后序遍历,其实他会先遍历到最左的叶子节点,然后此时该叶节点左右节点都为 null,所以左右子树高度都为 0,那么它的左右子树高度差当然小于 2,所以返回了该叶子节点高度为 1,然后继续往上递推…
  • 当然,我们都知道求一棵树的高度是如下
  •   int depth(TreeNode root) {
          if (root == null) return 0;
          return Math.max(depth(root.left), depth(root.right)) + 1;
      }
    
  • 所以如果你纯暴力解决的话,就可以遍历每个节点作为根节点,然后判断左右子树高度差是否小于 2,
  •   public boolean isBalanced(TreeNode root) {
          if (root == null) return true;
          // 当前节点作为根节点,左右子树高度差小于等于 1(即当前树为平衡树)
          //  && 左右子树也应该分别为平衡树
          return Math.abs(depth(root.left) - depth(root.right)) <= 1 
          && isBalanced(root.left) && isBalanced(root.right);
      }
    
      private int depth(TreeNode root) {
          if (root == null) return 0;
          return Math.max(depth(root.left), depth(root.right)) + 1;
      }
    

你可能感兴趣的:(算法学习,#,树,算法,数据结构,java)