列印二叉樹中第m層第k個節點(遞迴 非遞迴)

2021-07-13 01:28:13 字數 1516 閱讀 7152

前面的文章中已經討論過「 層序遍歷二叉樹指定的某層」的問題,在這個基礎上,對**稍作修改,即可完成「列印二叉樹中第m層第k個節點」,具體實現如下。

說明:根節點位於0層,每層中的第乙個節點的下標為0;所以如果要列印二叉樹中第m層第k個節點(需要傳入的引數分別為:(m-1) 和 (k-1))。

#include 

using

namespace

std;

#include

#include

typedef

struct node

binode, *bitree;

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

bitree createbitree()

return t;

}// 遞迴,輸出level層下標為k的節點。

// 引數level代表幾層(不是第幾層),k代表該層中要訪問的節點對應的下標;(如第3層,第2個節點 應傳入引數(2, 1))

int k = 1; // k=1 表示要訪問level層的第2個節點

int num = 0; // 初始化num,當訪問到對應的level層時,num用於統計該層節點對應的下標,當num==k時,即找到目標節點。

void printnodeatlevel(bitree t , int level)

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

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

}// 非遞迴(一),此處借助vector來實現,輸出level層下標為k的節點。

// 引數level代表幾層(不是第幾層),k代表該層中要訪問的節點對應的下標;(如第3層,第2個節點 應傳入引數(2, 1))

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

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

}// 跳出上面的while迴圈時,curlevel == level;然後直接列印出當前層的下標位於[cur + k]的那個節點即可。

printf("%c\n", vec[cur + k]->data);

}// 非遞迴(二),此處借助queue來實現,輸出level層下標為k的節點。

// 引數level代表幾層(不是第幾層),k代表該層中要訪問的節點對應的下標;(如第3層,第2個節點 應傳入引數(2, 1))

void printnodeatlevel3(bitree t, int level, int k)

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

}// 跳出上面的while迴圈時,curlevel == level;然後直接列印出當前層的下標是k的那個節點即可。

printf("%c\n", q[k]->data);

}int main(int argc, const

char * argv)

(演算法)二叉樹的第m層第k個節點

給定以下二叉樹 struct node node left,right int value 要求編寫函式 node foo node node,unsigned int m,unsigned int k 輸出以 node 為根的二叉樹第 m 層的第 k 個節點值.level,k 均從 0 開始計數 ...

二叉樹搜尋第k個節點(41)

給定一棵二叉搜尋樹,請找出其中的第k小的結點。例如,5,3,7,2,4,6,8 中,按結點數值大小順序第三小結點的值為4 1 分析 二叉搜尋樹的左子樹都小於根節點,右子樹都大於根節點。且其中序遍歷剛好是由大到小的順序,所以用中序遍歷來對二叉搜尋樹進行遍歷,同時統計第k大的節點 2 struct tr...

求二叉樹第m層上的第K個結點的值

2 給定以下二叉樹 struct node t 要求編寫函式 node t foo node t node,unsigned int m,unsigned int k 輸出以 node 為根的二叉樹第 m 層的第 k 個節點值.level,k 均從 0 開始計數 注意 此樹不是完全二叉樹 所謂的第k...