前面的文章中已經討論過「 層序遍歷二叉樹指定的某層」的問題,在這個基礎上,對**稍作修改,即可完成「列印二叉樹中第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...