- 問題:
1.求二叉樹葉子節點的個數
2.求二叉樹深度
3.判斷二叉樹是否為完全二叉樹
- 預備知識:
葉子:沒有左右孩子的結點。
樹的深度定義:樹中所有節點的層次的最大值稱為該樹的深度,其中規定根節點的層次為0 其他節點的層次為雙親節點層次+1。
完全二叉樹:對滿二叉樹的結點進行連續編號,約定編號從根結點起,自上而下,自左至右。深度為k的,有n個結點的二叉樹,
當且僅當其每一個結點都與深度為k的滿二叉樹編號從1至n的結點對應時,稱為完全二叉樹。
滿二叉樹:一顆深度為k且有2^k-1個節點的二叉樹稱為滿二叉樹。
- 思路:
1.選取某種遍歷方式遍歷二叉樹 判斷當前訪問的結點是否均沒有左右子樹,若均無,則計數器加一,直至遍歷結束。
2.遞歸方式求二叉樹的深度,設置max為所求的最大深度
遞歸出口:是否為葉子節點,若是回溯而且比較計數器與max值
遞歸邏輯:每訪問一個結點計數器加1
遞歸調用:調用該函數
3.層次遍歷+隊列
若針對此二叉樹
下圖中以#代表空
最后判斷隊列是否全為空即可,若不為空,說明在空節點后還存在着非空節點,則不為完全二叉樹。(理解完全二叉樹的定義)
#include<iostream> #include<string> #include<queue> using namespace std; int maxn = 0;//最大深度 int leaf = 0;//葉子結點個數 int sum = 0;//二叉樹的節點個數 typedef struct TNode { char data; TNode *leftchild, *rightchild; //構造函數 TNode(char d):data(d),leftchild(NULL),rightchild(NULL){}
//析構函數 }; void CreateTree(TNode **T) { char st='0'; cin >> st; if (st== '#')*T = NULL; else { *T = new TNode(st); //構造根節點 CreateTree(&(*T)->leftchild);//構造左子樹 CreateTree(&(*T)->rightchild);//構造右子樹 } } void Pre(TNode *t)//先序遍歷順序 先根節點 再左子樹 再右子樹 { TNode *T = t; if (T != NULL) { if (T->leftchild == NULL&&T->rightchild == NULL)leaf++; sum++;//根節點 Pre(T->leftchild);//左子樹 Pre(T->rightchild);//右子樹 } }//count聲明為全局變量 出現問題 因為命名空間std有一個count函數
void Depth(TNode *t,int k) { TNode *T = t; if (T != NULL) { if (T->leftchild == NULL&&T->rightchild == NULL) { if (k > maxn)maxn = k; }//k值隨着回溯會發生改變 Depth(T->leftchild,k+1); Depth(T->rightchild, k+1); } }
bool Level(TNode *t) { /*利用層次遍歷該樹,遇到NULL停止遍歷 ,若為完全二叉樹,則此時隊列中全為空指針*/ bool panduan=1; TNode *T = t; TNode *tem = NULL; queue<TNode *>q; q.push(T); tem = q.front(); q.pop(); while (tem != NULL) { q.push(tem->leftchild); q.push(tem->rightchild); tem = q.front(); q.pop(); } while (!q.empty()) { TNode *te; te = q.front(); q.pop(); if (te != NULL) { panduan = 0; break; } } return panduan; }
int main()
{
TNode *t;
//以先序遍歷方式創建二叉樹
CreateTree(&t);
Pre(t);
cout << "葉子節點的個數:" <<leaf << endl;
cout << "二叉樹的結點個數:" << sum << endl;
int k= 0;
Depth(t,k);
cout << "樹的深度:" << maxn << endl;
if (Level(t))cout << "該樹為完全二叉樹\n";
else cout << "該樹不是完全二叉樹\n";
}
偶然間看到求二叉樹深度更為簡潔的遞歸方式