二叉樹葉子節點 深度 以及完全二叉樹的判定


  • 問題:

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";

 
         

}

 

 偶然間看到求二叉樹深度更為簡潔的遞歸方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM