zoukankan      html  css  js  c++  java
  • 二叉平衡树

    1. 定义:
        平衡二叉树具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。常用算法有红黑树、AVL、Treap、伸展树等。其高度一般都良好地维持在O(log(n)),大大降低了操作的时间复杂度。
     
    2. 判断二叉树是否平衡:
        采用递归的方式,判断某个结点的平衡因子(左右子树高度差)是否大于1,若平衡因子大于1,则其一定不是平衡二叉树,否则,继续判断。代码如下:
    int depth(TreeNode * root)
    {
       //重要的递归边界条件,用于递归下潜到最下层
         if(root == NULL)
             return 0;
       //left和right会递归到最下层,从下而上地返回每个子节点的高度
          int left = depth(root->left);
          int right = depth(root->right);
       //一旦根的下层子节点有-1返回,-1会上潜到最终也返回-1
          if(left==-1 || right==-1 || abs(left-right)>1)
              return -1;
       //+1很关键,保证了树高度的上增
          return (left>right ? left : right) + 1;
    }
    
    bool isBalanced(TreeNode * root)
    {
         return depth(root) != -1;
    }
     
    3. 求平衡二叉树的高度:
        采用递归的方式求AVL树的高度,代码如下:
    int depth(TreeNode * root)
    {
       //重要的递归边界条件,用于递归下潜到最下层
          if(root == NULL)
              return 0;
       //left和right会递归到最下层,从下而上地返回每个子节点的高度
          int left = depth(root->left);
          int right = depth(root->right);
       //+1很关键,保证了树高度的上增
          return (left>right ? left : right) + 1;
    }
  • 相关阅读:
    Unity3D Editor模式下批量修改prefab
    3D touch在Unity3D中的使用
    Unity中的协程是什么?
    Unity3D脚本调用Objective C代码实现游戏内购买
    WindowsPhone8拍照功能实现简介
    WindowsPhone App如何扩展能够使用的内存
    SVN 提交代码时提示文件已经存在解决办法
    iOS检查App新版本并更新新版本
    iOS存储数据字典到沙盒
    统计整个Xcode工程代码行数
  • 原文地址:https://www.cnblogs.com/ladawn/p/8454953.html
Copyright © 2011-2022 走看看