数据结构之如何判断一棵二叉树是否是平衡二叉树(AVL树)

1. 二叉平衡树的概念

   参见另一篇博客

2 如何判断一棵二叉树是平衡二叉树?

   思路:

       先编写计算二叉树高度的函数,然后再判断每个节点的左右子树是否相差1。

   代码如下:


//判断二叉树的高度

      template<typename T>

  1. int DepthTree(BSTreeNode<T> *pbs)  
  2. {  
  3.     if (pbs==NULL)  
  4.         return 0;  
  5.     else  
  6.     {  
  7.         int leftLength=DepthTree(pbs->left);  
  8.         int rigthLength=DepthTree(pbs->right);  
  9.         return 1+(leftLength>rigthLength ? leftLength:rigthLength);  
  10.     }  
  11. }  

//判断二叉树是否是平衡二叉树(方法一)

  1. template<typename T>  
  2. bool isBalanceTree(BSTreeNode<T> *pbs)  
  3. {  
  4.     if (pbs==NULL)  
  5.     {  
  6.         return true;  
  7.     }  
  8.       
  9.     int depthLeft=DepthTree(pbs->left);  
  10.     int depthRight=DepthTree(pbs->right);  
  11.       
  12.     if (abs(depthLeft-depthRight)>1)   
  13.          return false;  
  14.     else  
  15.         return isBalanceTree(pbs->left) && isBalanceTree(pbs->right);  

//判断二叉树是否是平衡二叉树(方法二)

  1. template<typename T>  
  2. bool isBalanceTree(BSTreeNode<T> *pbs, int *pDepth)  
  3. {  
  4.     if (pbs==NULL)  
  5.     {  
  6.         *pDepth = 0;
  7.         return true;  
  8.     }  
  9.     int left, right ;
  10.     if (isBalanceTree(pbs->left,&left) && isBalanceTree(pbs->right,&right))    
  11.     {
  12.       int dift = left – right;
  13.       if(dift <=1 && dift >= -1)
  14.       {
  15.            *pDepth = 1 + (left > right ? left : right );
  16.            return true;
  17.        }
  18.      }
  19.      return false;  

: 方法一中一个节点要被重复遍历多次,时间效率不高;方法二使用了后序遍历的方法,只要遍历到一个节点之前我们已经遍历了它的左右子树。(参见剑指offer)

  测试代码:

  1. #include<iostream>  
  2. #include<cmath>  
  3. using namespace std;  
  4.   
  5. template<typename T>  
  6. struct BSTreeNode  
  7. {  
  8.     T data;  
  9.     BSTreeNode *left;  
  10.     BSTreeNode *right;  
  11. };  
  12.   
  13. template<typename T>  
  14. int DepthTree(BSTreeNode<T> *pbs)  
  15. {  
  16.     if (pbs==NULL)  
  17.         return 0;  
  18.     else  
  19.     {  
  20.         int leftLength=DepthTree(pbs->left);  
  21.         int rigthLength=DepthTree(pbs->right);  
  22.         return 1+(leftLength>rigthLength ? leftLength:rigthLength);  
  23.     }  
  24. }  
  25.   
  26. template<typename T>  
  27. bool isBalanceTree(BSTreeNode<T> *pbs)  
  28. {  
  29.     if (pbs==NULL)  
  30.     {  
  31.         return true;  
  32.     }  
  33.       
  34.     int depthLeft=DepthTree(pbs->left);  
  35.     int depthRight=DepthTree(pbs->right);  
  36.       
  37.     if (abs(depthLeft-depthRight)>1)   
  38.          return false;  
  39.     else  
  40.         return isBalanceTree(pbs->left) && isBalanceTree(pbs->right);  
  41. }  
  42.   
  43. void CreateTree1(BSTreeNode<int> *pHead)  
  44. {  
  45.      int m;  
  46.      int i;  
  47.      int rNum;                                                                                                                                                                                                          
  48.        
  49.      cin>>m;  
  50.       
  51.      BSTreeNode<int> *currentNode;  
  52.      currentNode=pHead;  
  53.      pHead->left=NULL;  
  54.      pHead->right=NULL;  
  55.   
  56.      cin>>currentNode->data;  
  57.         
  58.      for(i=1;i<m;i++)  
  59.      {     
  60.          rNum=rand()%2;  
  61.          if (rNum==0)  
  62.          {  
  63.              BSTreeNode<int> *leftNode;  
  64.              leftNode=new BSTreeNode<int>;  
  65.              cin>>leftNode->data;  
  66.              leftNode->left=NULL;  
  67.              leftNode->right=NULL;  
  68.              currentNode->left=leftNode;  
  69.              currentNode=leftNode;  
  70.          }  
  71.          else  
  72.          {  
  73.              BSTreeNode<int> *rightNode;  
  74.              rightNode=new BSTreeNode<int>;  
  75.              cin>>rightNode->data;  
  76.              rightNode->right=NULL;  
  77.              rightNode->left=NULL;  
  78.              currentNode->right=rightNode;  
  79.              currentNode=rightNode;  
  80.          }  
  81.      }  
  82. }  
  83.   
  84. void CreateTree2(BSTreeNode<int> *pHead)  
  85. {  
  86.     int m;  
  87.     cin>>m;  
  88.     cin>>pHead->data;  
  89.     pHead->left=NULL;  
  90.     pHead->right=NULL;  
  91.     int i;  
  92.     BSTreeNode<int> *pCurrent;  
  93.     pCurrent=pHead;  
  94.      
  95.     for (i=1;i<m;i++)  
  96.     {   
  97.        BSTreeNode<int> *pTemp;  
  98.        pTemp=new BSTreeNode<int>;  
  99.        pTemp->left=NULL;  
  100.        pTemp->right=NULL;  
  101.        cin>>pTemp->data;  
  102.        pCurrent->left=pTemp;  
  103.        pCurrent=pCurrent->left;  
  104.     }  
  105.       
  106.     pCurrent=pHead;  
  107.     while (pCurrent!=NULL)  
  108.     {  
  109.         cout<<pCurrent->data;  
  110.         pCurrent=pCurrent->left;  
  111.     }  
  112. }  
  113.   
  114. int main()  
  115. {  
  116.       
  117.     BSTreeNode<int> *head=NULL;  
  118.   
  119.     head=new BSTreeNode<int>;  
  120.     CreateTree1(head);  
  121.     //CreateTree2(head);  
  122.     if (isBalanceTree(head))  
  123.     {  
  124.         cout<<“It is a Balance Tree!”<<endl;  
  125.     }else  
  126.     {  
  127.         cout<<“The tree is not Balance!”<<endl;  
  128.     }  
  129.     return 0;  
  130. }  


    原文作者:AVL树
    原文地址: https://blog.csdn.net/u010098159/article/details/45026303
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞