二叉樹第k層節點個數 -- 採用遞歸和非遞歸方法

/*二叉樹第k層節點個數 -- 採用遞歸和非遞歸方法
經調試可運行源碼及分析以下:
***/
#include <stdlib.h>
#include <iostream>
#include <queue>ios

using std::cout;
using std::cin;
using std::endl;
using std::queue;.net

/*二叉樹結點定義*/
typedef struct BTreeNode
{
char elem;
struct BTreeNode *pleft;
struct BTreeNode *pright;
}BTreeNode;調試

/*
求二叉樹第k層的節點數
遞歸方式步驟:
給定根節點proot:
若是proot爲空,或者層數k_Level <= 0,則爲空樹或者不合要求,則返回0;
若是proot不爲空,且此時層數 k_Level==1,則此時proot爲第K層節點之一,則返回1;
若是proot不爲空,且此時層數 k_Level > 1,則此時須要求proot左子樹(k_Level - 1 )層節點數和proot右子樹(k_Level-1)層節點數;code

/*遞歸實現求二叉樹第k層的節點數*/
int get_k_level_number(BTreeNode *proot, int k)
{
if(proot == NULL || k <= 0)
return 0;
if(proot != NULL && k == 1)
return 1;blog

return (get_k_level_number(proot->pleft, k-1) +
  get_k_level_number(proot->pright, k-1));
}遞歸

/*非遞歸:按層次遍歷
找到第k層,藉助隊列實現。
**/
/*非遞歸實現求二叉樹第k層的節點數*/
int get_k_level_number_bylevelorder(BTreeNode* proot, int k)
{
if(proot == NULL || k == 0)
return 0;隊列

int cur_level_size = 0;//當前層的節點個數
int cur_level = 0; //當前層數ci

queue <BTreeNode*> que;
que.push(proot);
while (!que.empty())
{
++cur_level;
cur_level_size = que.size();
if(cur_level == k)//當到第k層時
break;get

int temp_count = 0;
//當前層的全部節點出隊,下一層的結點入隊
while (temp_count < cur_level_size)
{
++temp_count;
proot = que.front();
que.pop();
if (proot->pleft != NULL)
que.push(proot->pleft);
if (proot->pright != NULL)
que.push(proot->pright);
}
}
while(!que.empty())
que.pop();//清空隊列
if(cur_level == k)
return cur_level_size;
return 0;
}源碼

/*初始化二叉樹節點*/
BTreeNode* btree_init(BTreeNode* &bt)
{
bt = NULL;
return bt;
}

/*先序建立二叉樹*/
void pre_crt_tree(BTreeNode* &bt)
{
char ch;
cin >> ch;
if (ch == '#')
{
bt = NULL;
}
else
{
bt = new BTreeNode;
bt->elem = ch;
pre_crt_tree(bt->pleft);
pre_crt_tree(bt->pright);
}
}

int main()
{
int k_level_num = 0;
int k;
BTreeNode *bt;
btree_init(bt);//初始化根節點
pre_crt_tree(bt);//建立二叉樹

cout << "請輸入層數k:" << endl;
cin >> k;
cout << "遞歸遍歷結果:" << endl;
k_level_num = get_k_level_number(bt, k);
cout << "第" << k << "層的節點個數爲:" << k_level_num << endl;

cout << "非遞歸遍歷結果:" << endl;
k_level_num = get_k_level_number_bylevelorder(bt, k);
cout << "第" << k << "層的節點個數爲:" << k_level_num << endl;

system("pause");
return 0;
}


/*
運行結果:
a b c # # # d e # # f # g # #
請輸入層數k:
3
---以上爲輸入---
---如下爲輸出---
遞歸遍歷結果:
第3層的節點個數爲:3
非遞歸遍歷結果:
第3層的節點個數爲:3
請按任意鍵繼續. . .

本例建立的二叉樹形狀: a b d c e f g參考資料:http://blog.csdn.net/beitiandijun/article/details/41941211http://yuncode.net/code/c_505ea04f8f6186*/--------------------- 做者:lesliefish 來源:CSDN 原文:https://blog.csdn.net/y396397735/article/details/51152182 版權聲明:本文爲博主原創文章,轉載請附上博文連接!

相關文章
相關標籤/搜索