徹底二叉樹:若一棵二叉樹具備具備n個節點,它的每一個節點都與高度爲k的滿二叉樹編號爲0~n-1結點一一對應,則稱這可二叉樹爲徹底二叉樹。ios
方法一:一維數組存儲數組
根據徹底二叉樹的定義和性質,利用一位數組做爲徹底二叉樹的存儲,以下圖ide
由圖,節點的編號與數組元素的下標是一一對應的,可根據二叉樹的性質,可方便找出下標 爲i的的雙親結點a[i/2]及左右孩子結點a[i*2],a[i*2+1].這樣判斷一棵樹是否爲二叉樹,應該對此二叉樹從上到下,從左到右依次編號, 而後把編好的號依次存入一位數組中,在與相應深度的滿二叉樹的編號進行對比,便可判斷此二叉樹是否爲徹底二叉樹。測試
可是該方法雖然實現容易,但佔用空間太大,而且效率低,因此可經過層次遍從來判斷是否爲徹底二叉樹。spa
方法二:層次遍歷(利用隊列)3d
徹底二叉樹是指最後一層左邊是滿的,右邊可能慢也不能不滿,而後其他層都是滿的,根據這個特性,利用層遍歷。若是咱們當前遍歷到了NULL結點,若是後續還有非NULL結點,說明是非徹底二叉樹。orm
bool _CheckCompleteTree(Node *root) { queue<Node*> q; if (root == NULL) //空樹是徹底二叉樹 return true; q.push(root); bool flag = false; while (!q.empty()) { Node* front = q.front(); if (front != NULL) { if (flag) return false; q.push(front->_left); q.push(front->_right); } else flag = true; q.pop(); } return true; }
完整代碼及測試用例blog
#include<iostream> #include<queue> using namespace std; template<class T> struct BinaryTreeNode { T _data; BinaryTreeNode *_left; BinaryTreeNode *_right; BinaryTreeNode(const T& d) :_data(d) , _left(NULL) , _right(NULL) {} }; template<class T> class BinaryTree { typedef BinaryTreeNode<T> Node; public: BinaryTree() :_root(NULL) {} BinaryTree(const T *a, size_t size, const T& invalid) { size_t index = 0; _root = _CreateNode(a, size, index, invalid); } void CheckCompleteTree() { bool ret; ret = _CheckCompleteTree(_root); cout << "Is a complate BinaryTree?:" << ret << endl; } protected: bool _CheckCompleteTree(Node *root) { queue<Node*> q; if (root == NULL) //空樹是徹底二叉樹 return true; q.push(root); bool flag = false; while (!q.empty()) { Node* front = q.front(); if (front != NULL) { if (flag) return false; q.push(front->_left); q.push(front->_right); } else flag = true; q.pop(); } return true; } Node * _CreateNode(const T* a, size_t size, size_t& index, const T& invalid) { Node* root = NULL; while ((index < size) && (a[index] != invalid)) { root = new Node(a[index]); root->_left = _CreateNode(a, size, ++index, invalid); root->_right = _CreateNode(a, size, ++index, invalid); } return root; } protected: Node* _root; }; int main() { int a[10] = { 1, 2, 3, '#', '#', 4, '#', '#', 5, 6, }; BinaryTree<int> b1(a,10,'#'); b1.CheckCompleteTree(); int a2[9] = { 1, 2, '#', 3,'#', 4, '#', '#', 5 }; BinaryTree<int> b2(a2, 9, '#'); b2.CheckCompleteTree(); system("pause"); return 0; }