【C++】满二叉树与完全二叉树的区别及判断
2015-11-29 14:12
656 查看
[align=left]满二叉树与完全二叉树的区别:[/align]
(1)完全二叉树,除最后一层可能不满以外,其他各层都达到该层节点的最大数;最后一层如果不满,该层所有
节点都全部靠左排。
[align=left](2)满二叉树,所有层的节点数都达到最大.[/align]
[align=left]满二叉树与完全二叉树的判断:[/align]
[align=left](1)满二叉树:因为满二叉树的节点个数size与树的深度h的关系为:2^h - 1 = size,所以只需求出所要判断的树的[/align]
[align=left] 的节点个数与深度,验证是否满足该关系式即可。[/align]
[align=left](2)完全二叉树:利用层序遍历(空节点也入队列),若遇到NULL节点后,还有非空节点,就不是完全二叉树[/align]
#include<iostream> #include<queue> using namespace std; struct BinaryTreeNode { char _data; BinaryTreeNode*_left; BinaryTreeNode*_right; BinaryTreeNode(const char &data) :_data(data) , _left(NULL) , _right(NULL) {} }; class BinaryTree { public: BinaryTree(const char *str) { _CreatBinaryTree(_root, str);//递归创建二叉树 } int Size() //求二叉树的节点个数 { return _Size(_root); } int Depth()//求二叉树的深度 { return _Depth(_root); } void FullResult()//二叉树判满的输出结果 { if (FullBinaryTree()) { cout << "该二叉树是满二叉树" << endl; } else { cout << "该二叉树不是满二叉树" << endl; } } void CompletelyResult()//二叉树是否为完全二叉树的输出结果 { if (CompletelyBinaryTree()) { cout << "该二叉树是完全二叉树" << endl; } else { cout << "该二叉树不是完全二叉树" << endl; } } protected: //递归创建二叉树 void _CreatBinaryTree(BinaryTreeNode*&root, const char *&str) { if (*str != '#'&&*str != '\0') { root = new BinaryTreeNode(*str); _CreatBinaryTree(root->_left, ++str); if (*str != '\0') { _CreatBinaryTree(root->_right, ++str); } } } int _Size(BinaryTreeNode*root) { if (root == NULL) { return 0; } else { return 1 + _Size(root->_left) + _Size(root->_right); } } int _Depth(BinaryTreeNode*root) { if (root == NULL) { return 0; } else { return 1 + (_Depth(root->_left) > _Depth(root->_right) ? _Depth(root->_left):_Depth(root->_right)); } } bool FullBinaryTree()//判断该二叉树是否是满二叉树 { if (pow(2, Depth()) - 1 == Size()) { return true; } return false; } bool CompletelyBinaryTree()//判断该二叉树是否是完全二叉树 { int flag = false; queue<BinaryTreeNode *>q; if (_root) { q.push(_root); } while (!q.empty()) { BinaryTreeNode* front = q.front(); q.pop(); if (front) { if (flag) { return false; } q.push(front->_left); q.push(front->_right); } else { flag = true; } } return true; } private: BinaryTreeNode*_root; };
相关文章推荐
- C++引用方式实现两个值的互换
- C++运算符重载
- C++抛出异常与传递参数的区别
- C++抛出异常与传递参数的区别
- C++【线程同步】-临界区同步
- c/c++进制转换
- C++的chrono、ratio和ctime等头文件
- leetcode Search a 2D Matrix
- C语言命名空间
- c语言字符数组与字符串的使用详解
- 读取文本文件,打印到屏幕
- C语言中switch的用法
- 合并两个排序的链表(C++版)
- C++模版完全解析
- C++中的static关键字
- C++标准库Vector & Iterator用法
- C++ 关于 调用函数时值传递和引用的理解
- 用c语言进行“面向对象编程”------学习doubango源码心得------阿冬专栏!!!
- C++ STL (1)set容器用法、操作详细介绍
- c++ iterator(迭代器)分类及其使用