【C++】滿二叉樹與完全二叉樹的區別及判斷
阿新 • • 發佈:2019-01-02
#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; };