層序遍歷二叉樹指定的某層

2021-07-12 07:28:48 字數 1534 閱讀 8838

題目:寫乙個函式,列印二叉樹中某層次的節點(從左到右),其中根節點為第0層,函式原型為int printnodeatlevel(node* root, int level),成功返回1,失敗返回0。

(一)遞迴解法

思路分析:假設要求訪問二叉樹中第k層的節點,那麼可以把它轉換成訪問以「該二叉樹根節點的左右節點」為根的兩顆左右子樹的第k-1層的節點。依次遞迴,直到k=0時,輸出節點即可。

(二)非遞迴解法

前面幾篇部落格已經講述了「 二叉樹的層序遍歷、層序列印」,同樣的思想,我們稍作修改即可。

具體實現如下:

注意點:第 k 層節點,位於(k-1)層;(例如,根節點位於 0 層,即第1層)

#include 

using

namespace

std;

#include

#include

typedef

struct node

binode, *bitree;

// 先序建立二叉樹 (輸入時,按先序次序輸入二叉樹中結點的值,以 # 字元表示空樹)

bitree createbitree()

return t;

}// (遞迴1),輸出二叉樹某一層結點(從左到右)

int printnodeatlevel1(bitree t , int level) // 引數level代表幾層(不是第幾層)

return printnodeatlevel1(t->lchild,level-1) + printnodeatlevel1(t->rchild,level-1);

}// (遞迴2),輸出二叉樹某一層結點(從左到右)[遞迴1的缺點:return a() + b()似乎不能保證從左往右輸出,因為a() + b()的呼叫順序是由編譯器決定的,並不一定是從左往右。如果列印時一定需要返回值,對「遞迴2」做適當修改即可]

void printnodeatlevel(bitree t , int level) // 引數level代表幾層(不是第幾層)

printnodeatlevel(t->lchild , level - 1);

printnodeatlevel(t->rchild , level - 1);

}// 非遞迴(一),此處借助vector來實現。

void printnodeatlevel2(bitree t, int level) // 引數level代表幾層(不是第幾層)

curlevel++; // 當前層數加1

}for (int i = cur; i < vec.size(); i++)

}// 非遞迴(二),此處借助queue來實現。

void printnodeatlevel3(bitree t, int level) // 引數level代表幾層(不是第幾層)

curlevel++; // 當前層數加1

}for (int i = 0; i < q.size(); i++)

}int main(int argc, const

char * argv)

二叉樹層序遍歷 求二叉樹的層序遍歷

給定乙個二叉樹,返回該二叉樹層序遍歷的結果,從左到右,一層一層地遍歷 例如 給定的二叉樹是,該二叉樹層序遍歷的結果是 3 9,20 15,7 示例1 輸入 返回值 1 2 示例2輸入 返回值 1 2,3 4,5 解題思路 重點是如何把在一層的節點放到一起,設定乙個引數專門放一層的節點 class t...

層序遍歷二叉樹

要求 設計乙個演算法層序遍歷二叉樹 同一層從左到右訪問 我寫了乙個演算法 用乙個佇列儲存被訪問的當前節點的左右孩子以實現層序遍歷。status hierarchybitree bitree t,status visit telemtype e destroyqueue q 釋放佇列空間 return...

二叉樹層序遍歷

主要流程 確定root非空 根指標進佇列 佇列非空就一直迴圈 依次掃瞄目前佇列中所有元素 新增的不算 從佇列取出第一元素 將值放入結果vector中 判斷左右子節點非空,並依次入隊 將本次結果放入二維陣列中 如果需要按層逆序輸出的話,在這裡將二維結果倒排一下 返回二維結果 vector levelo...