第110题:平衡二叉树

一. 问题描述

给定一个二叉树,判断它是否是高度平衡的二叉树。

本题中,一棵高度平衡二叉树定义为:

一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过1。

示例 1:

给定二叉树 [3,9,20,null,null,15,7]

    3

   / \

  9  20

    /  \

   15   7

返回 true 。

示例 2:

给定二叉树 [1,2,2,3,3,null,null,4,4]

 

       1

      / \

     2   2

    / \

   3   3

  / \

 4   4

返回 false 。

 

二. 解题思路

本题思路:采用深度优先遍历+递归自顶而下判断每个节点的左右子树高度是否大于1的方法。

步骤一:递归得到每个节点左右子树的深度。然后依次比较每个节点,只要有一个节点左右子树深度大于则返回false。否则,返回true。

三. 执行结果

执行用时 :6 ms, 在所有 java 提交中击败了5.92%的用户

内存消耗 :39 MB, 在所有 java 提交中击败了37.88%的用户

四. Java代码

class Solution {
    public boolean isBalanced(TreeNode root) {
         if(root==null) {
          return true;
      }else {
       Stack<TreeNode> data=new Stack<TreeNode>();
       data.add(root);
       while(!data.empty()) {
           TreeNode temp=data.pop();
           int rinum=0,lenum=0;
           if(temp.right!=null) {
               data.push(temp.right);
               List<TreeNode> rightlist=new ArrayList<TreeNode>();
               rightlist.add(temp.right);
               rinum=getTree(rightlist);

           }
           if(temp.left!=null) {
               data.push(temp.left);
               List<TreeNode> leftlist=new ArrayList<TreeNode>();
               leftlist.add(temp.left);
               lenum=getTree(leftlist);
           }
           
           if(Math.abs(lenum-rinum)>1) {
               return false;
           }          
       }
       return true;
      }
    }
    public int getTree(List<TreeNode> list) {
        if(list.size()==0) {
            return 0;
        }
        
        List<TreeNode> dataList=new ArrayList<TreeNode>();
        for(int i=0;i<list.size();i++) {
            TreeNode tempNode=list.get(i);
            if(tempNode.left!=null) {
                dataList.add(tempNode.left);
            }
            if(tempNode.right!=null) {
                dataList.add(tempNode.right);
            }
        }
        return getTree(dataList)+1;
        
    }
}

 

posted @ 2019-11-12 10:28  fish大叔  阅读(710)  评论(0编辑  收藏  举报