zoukankan      html  css  js  c++  java
  • 判断一个二叉树是否平衡

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

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

    1、自顶向下的方法 时间复杂度O(n^2)

     1  //自顶向下的方法:先求左右子树的深度 深度差的绝对值大于1则 不是平衡的 
     2  //由于每次都要求左右子树的深度 时间复杂度为O(n^2)
     3 class Solution {
     4 public:
     5     bool isBalanced(TreeNode* root) {
     6         if(!root) return true;//空节点是平衡的
     7         //判断根节点是否平衡 左右子树深度差的绝对值小于等于1 则平衡
     8         bool root_balance=abs(depth(root->left)-depth(root->right))<=1?true:false;
     9         //如果根节点不平衡 则此树不平衡
    10         if(!root_balance) return false;
    11         //根节点平衡 则判断左右子树是否平衡
    12         else return isBalanced(root->left)&&isBalanced(root->right);
    13     }
    14     int depth(TreeNode* root)//求以root为根结点的树的深度
    15     {
    16         if(!root) return 0;
    17         else
    18             return max(depth(root->left),depth(root->right))+1;//取左右子树大的深度+1
    19     }
    20 };

    2、自底向上的方法 时间复杂度O(n)

     1 //自底向上的方法 时间复杂度O(n)
     2 //树的后根序遍历 从下向上判断 从最左边的节点开始 
     3 class Solution {
     4 public:
     5     bool isBalanced(TreeNode* root) {
     6         return depth(root)!=-1;//不为-1 代表此树中没有不平衡的结点
     7     }
     8     int depth(TreeNode* root)//求以root为根结点的树的深度 
     9     {
    10         //当返回值大于等于零时代表树的深度 
    11         //当返回值等于-1时 代表已找到不平衡的结点
    12         if(!root) return 0;
    13         int left_depth=depth(root->left);
    14         if(left_depth==-1) return -1;//已在左子树中找到 不平衡的结点 可以停止递归了
    15         int right_depth=depth(root->right);
    16         if(right_depth==-1) return -1;//已在右子树中找到 不平衡的结点 可以停止递归了
    17         //如果左右子树的深度差小于1 则此节点平衡 返回左右节点最深的深度+1
    18         //如果左右子树深度差大于1 则此结点不平衡 返回-1
    19         return (abs(left_depth-right_depth)<=1?max(left_depth,right_depth)+1:-1);
    20     }
    21 };
  • 相关阅读:
    清除所有标签的属性
    chm提取
    视频分享
    依赖注入
    python-markdown
    light sdk
    ~
    html标签引入外部html
    微信公众平台自定义菜单
    还在为需要ajax而导入jquery吗? 纯js封装ajax操作
  • 原文地址:https://www.cnblogs.com/lancelee98/p/11663023.html
Copyright © 2011-2022 走看看