滿二叉樹:一顆深度為k且有2^k-1個節點的二叉樹稱為滿二叉樹;
完全二叉樹:對滿二叉樹的結點進行連續編號,約定編號從根結點起,自上而下,自左至右。深度為k的,有n個結點的二叉樹,當且僅當其每一個結點都與深度為k的滿二叉樹編號從1至n的結點對應時,稱為完全二叉樹。如圖所示:
1. 判定完全二叉樹。判定一棵樹是不是完全二叉樹的思路是廣度遍歷該二叉樹,當出現NULL值時停止遍歷,如果此時還有沒有遍歷到的結點,那麼就說明該樹非完全二叉樹,因為有空洞。C++代碼如下:
#include "stdafx.h" #include <list> using namespace std; struct Tree{ Tree() { data = 0; pLeftChild = NULL; pRightChild = NULL; } int data; Tree* pLeftChild; Tree* pRightChild; }; Tree* GetFrontPtr(std::list<Tree*> &q) { if (q.empty()) { return NULL; } else { Tree* pRet = q.front(); q.pop_front(); return pRet; } return NULL; } bool IsCompleteTree(Tree *pRoot) { std::list<Tree*> q; Tree *ptr; q.push_back(pRoot); while ((ptr = GetFrontPtr(q)) != NULL) { q.push_back(ptr->pLeftChild); q.push_back(ptr->pRightChild); } while (!q.empty()) { ptr = q.front(); q.pop_front(); if (NULL != ptr) { return false; } } return true; } int _tmain(int argc, _TCHAR* argv[]) { Tree t1; Tree t2; Tree t3; Tree t4; Tree t5; Tree t6; Tree t7; Tree t8; Tree t9; Tree t10; t1.pLeftChild = &t2; t1.pRightChild = &t3; t2.pLeftChild = &t4; t2.pRightChild = &t5; t3.pLeftChild = &t6; bool ret = IsCompleteTree(&t1); return 0; }
2. 判定滿二叉樹。判定一棵樹是否是滿二叉樹的思路類似,還是首先將二叉樹按照廣度優先的方法push到隊列裡邊(暫時不pop),然後開始pop,第一次pop,只pop一個元素,第二次pop1*2個元素,第三次pop1*2*2個元素,依次類推,如果該pop1*2^k個元素時,但是還沒有pop完,list就空了,那麼證明該樹為非滿二叉樹。代碼就不貼了。