数据结构之如何判断一棵二叉树是否是平衡二叉树(AVL树)
来源:互联网 发布:淘宝商城黄金首饰 编辑:程序博客网 时间:2024/05/20 04:51
1. 二叉平衡树的概念
参见另一篇博客
2 如何判断一棵二叉树是平衡二叉树?
思路:
先编写计算二叉树高度的函数,然后再判断每个节点的左右子树是否相差1。
代码如下:
//判断二叉树的高度
template<typename T>
- int DepthTree(BSTreeNode<T> *pbs)
- {
- if (pbs==NULL)
- return 0;
- else
- {
- int leftLength=DepthTree(pbs->left);
- int rigthLength=DepthTree(pbs->right);
- return 1+(leftLength>rigthLength ? leftLength:rigthLength);
- }
- }
//判断二叉树是否是平衡二叉树(方法一)
- template<typename T>
- bool isBalanceTree(BSTreeNode<T> *pbs)
- {
- if (pbs==NULL)
- {
- return true;
- }
- int depthLeft=DepthTree(pbs->left);
- int depthRight=DepthTree(pbs->right);
- if (abs(depthLeft-depthRight)>1)
- return false;
- else
- return isBalanceTree(pbs->left) && isBalanceTree(pbs->right);
- }
//判断二叉树是否是平衡二叉树(方法二)
- template<typename T>
- bool isBalanceTree(BSTreeNode<T> *pbs, int *pDepth)
- {
- if (pbs==NULL)
- {
- *pDepth = 0;
- return true;
- }
- int left, right ;
- if (isBalanceTree(pbs->left,&left) && isBalanceTree(pbs->right,&right))
- {
- int dift = left - right;
- if(dift <=1 && dift >= -1)
- {
- *pDepth = 1 + (left > right ? left : right );
- return true;
- }
- }
- return false;
- }
: 方法一中一个节点要被重复遍历多次,时间效率不高;方法二使用了后序遍历的方法,只要遍历到一个节点之前我们已经遍历了它的左右子树。(参见剑指offer)
测试代码:
- #include<iostream>
- #include<cmath>
- using namespace std;
- template<typename T>
- struct BSTreeNode
- {
- T data;
- BSTreeNode *left;
- BSTreeNode *right;
- };
- template<typename T>
- int DepthTree(BSTreeNode<T> *pbs)
- {
- if (pbs==NULL)
- return 0;
- else
- {
- int leftLength=DepthTree(pbs->left);
- int rigthLength=DepthTree(pbs->right);
- return 1+(leftLength>rigthLength ? leftLength:rigthLength);
- }
- }
- template<typename T>
- bool isBalanceTree(BSTreeNode<T> *pbs)
- {
- if (pbs==NULL)
- {
- return true;
- }
- int depthLeft=DepthTree(pbs->left);
- int depthRight=DepthTree(pbs->right);
- if (abs(depthLeft-depthRight)>1)
- return false;
- else
- return isBalanceTree(pbs->left) && isBalanceTree(pbs->right);
- }
- void CreateTree1(BSTreeNode<int> *pHead)
- {
- int m;
- int i;
- int rNum;
- cin>>m;
- BSTreeNode<int> *currentNode;
- currentNode=pHead;
- pHead->left=NULL;
- pHead->right=NULL;
- cin>>currentNode->data;
- for(i=1;i<m;i++)
- {
- rNum=rand()%2;
- if (rNum==0)
- {
- BSTreeNode<int> *leftNode;
- leftNode=new BSTreeNode<int>;
- cin>>leftNode->data;
- leftNode->left=NULL;
- leftNode->right=NULL;
- currentNode->left=leftNode;
- currentNode=leftNode;
- }
- else
- {
- BSTreeNode<int> *rightNode;
- rightNode=new BSTreeNode<int>;
- cin>>rightNode->data;
- rightNode->right=NULL;
- rightNode->left=NULL;
- currentNode->right=rightNode;
- currentNode=rightNode;
- }
- }
- }
- void CreateTree2(BSTreeNode<int> *pHead)
- {
- int m;
- cin>>m;
- cin>>pHead->data;
- pHead->left=NULL;
- pHead->right=NULL;
- int i;
- BSTreeNode<int> *pCurrent;
- pCurrent=pHead;
- for (i=1;i<m;i++)
- {
- BSTreeNode<int> *pTemp;
- pTemp=new BSTreeNode<int>;
- pTemp->left=NULL;
- pTemp->right=NULL;
- cin>>pTemp->data;
- pCurrent->left=pTemp;
- pCurrent=pCurrent->left;
- }
- pCurrent=pHead;
- while (pCurrent!=NULL)
- {
- cout<<pCurrent->data;
- pCurrent=pCurrent->left;
- }
- }
- int main()
- {
- BSTreeNode<int> *head=NULL;
- head=new BSTreeNode<int>;
- CreateTree1(head);
- //CreateTree2(head);
- if (isBalanceTree(head))
- {
- cout<<"It is a Balance Tree!"<<endl;
- }else
- {
- cout<<"The tree is not Balance!"<<endl;
- }
- return 0;
- }
0 0
- 数据结构之如何判断一棵二叉树是否是平衡二叉树(AVL树)
- 如何判断一棵二叉树是否是平衡二叉树(AVL)
- 判断一个二叉树是否是平衡二叉树(AVL)
- 判断一棵二叉树是否是平衡二叉树
- 数据结构面试题/判断一棵二叉树是否是平衡二叉树
- .如何判断一棵二叉树是否是平衡二叉树
- 判断一颗二叉树是否为平衡二叉树(AVL)
- 判断一颗二叉树是否是平衡二叉树
- 剑指Offer--039-平衡二叉树(判断一棵二叉树是否是平衡二叉树)[扩展附加题]
- 判断一棵二叉查找树是否是平衡树
- 【数据结构】平衡二叉树之AVL树
- 数据结构之平衡二叉树AVL
- 数据结构 - 平衡二叉树 AVL
- 数据结构-AVL二叉平衡树
- 【二叉树】判断一棵二叉树是否是平衡二叉树
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- 输入一棵二叉树,判断该二叉树是否是平衡二叉树。
- WPF-自定义滚动条ScrollBar
- C/C++--memcpy函数实现
- Hibernate4 + ehcache
- Mac OS X版本的sublime text 3安装汇编语言语法支持
- [Java]取得两个字符串的最大相同子串
- 数据结构之如何判断一棵二叉树是否是平衡二叉树(AVL树)
- printf 输出格式
- 二进制中1的个数
- iOS 短信验证码
- 两种方法,给你的Safari浏览器添加必应/有道/谷歌网页即时翻译插件
- Linux添加新硬盘、分区、格式化、自动挂载
- iOS开发系列--通讯录、蓝牙、内购、GameCenter、iCloud、Passbook系统服务开发汇总
- php大数字格式化,大数据格式化,科学计数法,长数字格式化,函数number_format
- 设置普通用户无密码sudo权限