劍指Offer面試題 21 從上到下列印二叉樹

2021-09-07 22:37:45 字數 2281 閱讀 5183

題目:從上往下列印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。例如輸入下圖中的二叉樹,則依次列印出8、6、10、5、7、9、11。

二叉樹節點的定義如下,採用c#語言描述:

public

class

binarytreenode

public binarytreenode leftchild

public binarytreenode rightchild

public binarytreenode(int

data)

public binarytreenode(int

data, binarytreenode left, binarytreenode right)

}

這道題實質是考查樹的層次遍歷(廣度優先遍歷)演算法:

每一次列印乙個結點的時候,如果該結點有子結點,則把該結點的子結點放到乙個佇列的末尾。接下來到佇列的頭部取出最早進入佇列的結點,重複前面的列印操作,直至佇列中所有的結點都被列印出來為止。

擴充套件:如何廣度優先遍歷乙個有向圖?這同樣也可以基於佇列實現。樹是圖的一種特殊退化形式,從上到下按層遍歷二叉樹,從本質上來說就是廣度優先遍歷二叉樹。

static

void

printfromtoptobottom(binarytreenode root)

queue

queue = new queue();

queue.enqueue(root);

while (queue.count > 0

) \t

", printnode.data);

if (printnode.leftchild != null

)

if (printnode.rightchild != null

) }}

本次測試封裝了幾個輔助測試的方法,實現如下:

static

void testportal(string

testname, binarytreenode root)

begins:

", testname);

}console.writeline(

"the nodes from top to bottom, from left to right are:");

printfromtoptobottom(root);

console.writeline("\n

");}

static

void

setsubtreenode(binarytreenode root, binarytreenode lchild, binarytreenode rchild)

root.leftchild =lchild;

root.rightchild =rchild;

}static

void

clearuptreenode(binarytreenode root)

}

view code

//

10

/// \

//6 14

///\ /\

//4 8 12 16

static

void

test1()

//5///

//4///

//3///

//2///

//1static

void

test2()

//1//\

//2//\

//3//\

//4//\

//5static

void

test3()

//樹中只有1個結點

static

void

test4()

//樹中木有結點

出處:

劍指offer面試題21

面試題21 包含min函式的棧 題目 定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 預備知識 棧的定義 模板函式 思路 面對乙個複雜的問題,我們可以舉幾個具體的例子來尋找規律,對於本題目,我們可以通過舉例來分析它...

劍指offer 面試題32 從上到下列印二叉樹

不分行從上到下列印二叉樹 從上到下列印出二叉樹的每個節點,同一層的節點按照從左到右的順序列印。class binarytreenode 使用佇列來完成,列印的同時也在往裡面加入。public void fun binarytreenode root queue queue newlinkedlist...

劍指offer 面試題21 相關

題目 設計包含min函式的棧,pop push min 的時間複雜度均為o 1 自己所寫 如下 寫 棧 的 還是有些不熟練!include using namespace std const int max 100 class stack stack stack stack stack bool s...