劍指Offer對答如流系列 從上往下列印二叉樹

2022-08-30 02:18:11 字數 2574 閱讀 3012

樹的結構定義如下:

public class node

}

(一)不分行從上到下列印二叉樹

從上往下列印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。

比如下面二叉樹,輸出順序為 8 6 10 5 7 9 11

(二)分行從上到下列印二叉樹

從上到下按層列印二叉樹,同一層的結點按從左到右的順序列印,每一層列印到一行。

比如下面二叉樹,輸出順序為

6 10

5 7 9 11

(三)之字形列印二叉樹

請實現乙個函式按照之字形順序列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右到左的順序列印,第三行再按照從左到右的順序列印,其他行以此類推。

比如下面二叉樹,輸出順序為

10 6

5 7 9 11

三個問題循序漸進。

我們首先看第乙個,這個很明顯就是層序遍歷,結點滿足先進先出的原則,採用佇列。每從佇列中取出頭部結點並列印,若其有子結點,把子結點放入佇列尾部,直到所有結點列印完畢。

關於樹的層序遍歷我們早就**過了 劍指offer對答如流系列 - 重建二叉樹

第二個問題的解決很明顯建立在第乙個問題的解決方法基礎上,因為要按行列印,依據樹的特點,我們需要增加兩個變數:當前層結點數目pcount,下一層結點數目nextcount。根據當前層結點數目來列印當前層結點,同時計算下一層結點數目,之後令pcount等於nextcount,重複迴圈,直到列印完畢。

第三個問題的解決很明顯建立在第二個問題的解決方法基礎上,因為涉及到逆序輸出,我們可以用兩個棧。對於不同層的結點,乙個棧用於正向儲存,乙個棧用於逆向儲存,列印出來就正好是相反方向。

除了這種思路之外,我們也可以多定義乙個表示當前層數的變數level。每層結點不直接列印,放入乙個陣列中,根據此時的層數level的奇偶來決定正向還是反向列印陣列。

因為鍊錶刪除和新增元素 速度非常快,選擇使用鍊錶實現棧。

public void printtree(node root) 

linkedlistqueue = new linkedlist<>();

queue.offer(root);

node node;

while (queue.size()!=0)

system.out.println();

}

public void printtree(node root) 

linkedlistqueue = new linkedlist<>();

queue.offer(root);

node node = null;

int pcount; //當前層結點數目

int nextcount = 1; //下一層結點數目

while (!queue.isempty())

if (node.right != null)

}system.out.println();}}

思路1

public void printtree(node root) 

stackstack1 = new stack<>();

stackstack2 = new stack<>();

node node;

stack1.push(root);

while(!stack1.empty() || !stack2.empty())

system.out.println();

while(!stack2.empty())

system.out.println();}}

思路2

public void printtree(node root) 

linkedlistqueue = new linkedlist<>();

queue.offer(root);

node node;

int pcount; //當前層結點數目

int nextcount = 1; //下一層結點數目

int level=1; //層數

int pnums; //用於儲存當前層的數字

while (!queue.isempty())

if (node.right != null)

}//根據當前層數確定正向或者反向列印陣列

if( (level&1) != 0 )

}level++;

system.out.println();}}

劍指Offer對答如流系列 醜數

我們把只包含質因子2 3和5的數稱作醜數 ugly number 求按從小到大的順序的第n個醜數。例如6 8都是醜數,但14不是,因為它包含質因子7。習慣上我們把1當做是第乙個醜數。判斷乙個數是不是醜數,最容易想到的方法就是讓這個數不斷除以2,3,5。對於第n個醜數,只要從1開始,依次判斷每個數是不...

劍指Offer對答如流系列 剪繩子

給你一根長度為n繩子,請把繩子剪成m段 m n都是整數,n 1並且m 1 每段的繩子的長度記為k 0 k 1 k m k 0 k 1 k m 可能的最大乘積是多少?例如當繩子的長度是8時,我們把它剪成長度分別為2 3 3的三段,此時得到最大的乘積18。遇到問題,先分析問題,由分析的結果確定所運用的演...

劍指Offer對答如流系列 包含min函式的棧

定義棧的資料結構,請在該型別中實現乙個能夠得到棧的最小元素的min函式。在該棧中,呼叫min push及pop的時間複雜度都是o 1 push 和 pop均容易實現。主要就是min函式的定義,如果要通過操作push和pop操作獲取最小元素時間複雜度為o 1 基本上是不可能的。如果我們另外定義乙個成員...