判断是否是平衡二叉树
来源:互联网 发布:淘宝店开店流程 编辑:程序博客网 时间:2024/05/23 01:24
本文有两种方法判断一棵树是否为AVL树#include <iostream>#include<math.h> //abs#include<queue>#include <string>using namespace std;typedef struct TreeNode{ string data; struct TreeNode* lchild; struct TreeNode* rchild;}TreeNode;void levelTraver(TreeNode* T) //层次遍历{ if (!T) return; queue<TreeNode*> Q; TreeNode* cur = T; Q.push(cur); while (!Q.empty()) { cout << Q.front()->data << " "; cur = Q.front(); Q.pop(); if (cur->lchild) Q.push(cur->lchild); if (cur->rchild) Q.push(cur->rchild); }}TreeNode* NodebyString(string s) //根据s的值{ if (s == "#") //若str[i]的值为#,则不创建节点 return NULL; else //否则,创建节点并返回 { TreeNode* node = new TreeNode; node->data = s; return node; }}TreeNode* levelDeSerialize(string str[]) //层序反序列化{ int index1 = 0; TreeNode* T = NodebyString(str[index1++]); queue<TreeNode*> Q; if (T != NULL) Q.push(T); TreeNode* cur; while (!Q.empty()) { cur = Q.front(); Q.pop(); cur->lchild = NodebyString(str[index1++]); cur->rchild = NodebyString(str[index1++]); if (cur->lchild) Q.push(cur->lchild); if (cur->rchild) Q.push(cur->rchild); } return T;}int height(TreeNode* T) //求树的高度{ if (!T) return 0; //后序遍历求树的高度 int LH = height(T->lchild); int RH = height(T->rchild); return (LH > RH) ? (1 + LH) : (1 + RH);}//方法一:bool isAVLTree1(TreeNode* T) //是否为平衡二叉树{ if (!T) //求以T为根的二叉树是否为AVL树 return true; int LH = height(T->lchild); //求左子树的高度 int RH = height(T->rchild); //求右子树的高度 if (abs(LH - RH) > 1) return false; //再判断T的左子树和右子树是否为AVL树 return isAVLTree1(T->lchild) && isAVLTree1(T->rchild); }//方法二://二叉树的层序遍历,顺便记录每一个节点的高度depth、平衡性bool isAVLTree2(TreeNode* T,int &depth) //传入的必须是引用{ if (!T) { depth = 0; return true; } int LH = 0; int RH = 0; if (isAVLTree2(T->lchild, LH) && isAVLTree2(T->rchild, RH)) { if (abs(LH - RH) <= 1) { depth = 1 + (LH > RH ? LH : RH); return true; } } return false;}int main(){ string str[] = { "1", "2", "3", "#", "4", "5", "#", "6", "#", "#", "#", "#","#" }; TreeNode* T = levelDeSerialize(str); //反序列化 cout << "层序遍历" << endl; levelTraver(T); cout << "\n高度 = "; int H = height(T); cout << H << endl; int depth = 0; bool isAVL = isAVLTree2(T, depth); cout <<"是否为平衡二叉树"<<isAVL << endl; return 0;}
阅读全文
0 0
- 判断二叉树是否是平衡树
- 判断二叉树是否是平衡树
- 判断二叉树是否是平衡树
- 判断一颗树是否是平衡二叉树
- 判断是否是平衡二叉树
- 判断一棵树是否是平衡二叉树
- 判断是否是平衡二叉树
- 判断二叉数是否是平衡树
- 判断是否是平衡二叉树
- Leetcode110 判断是否是平衡二叉树
- 判断一棵树是否是平衡二叉树
- 判断是否是平衡二叉树
- 判断是否是平衡二叉树
- 判断是否是平衡二叉树
- 判断一棵树是否是平衡二叉树
- 判断是否是子树 和 判断二叉树是否平衡
- 判断一个二叉树是否是平衡二叉树
- 【二叉树8】判断一颗树是否是平衡二叉树
- Find them, Catch them POJ
- 关于双硬盘电脑掉盘的问题
- 基于共现提取人民的民义人物关系
- Cannot find module 'socket.io'
- 梯度下降的三种形式,BGD,SGD与MGD
- 判断是否是平衡二叉树
- iOS UITableView~datasource(数据源方法)
- Hive(下)
- Java中的static关键字解析
- java核心技术卷 之文本输入
- python中的按位运算符——转 菜鸟教程
- get/post请求,以及参数传递过程中乱码问题
- android 获取连接WiFi的名称
- 莫比乌斯反演专题训练及解答总结