第三十天 二叉樹的後序遍歷

2021-10-24 09:53:49 字數 2194 閱讀 3341

今天是釋然發題解的第三十天,以後會經常和大家分享學習路上的心得,希望和大家一起進步,一起享受coding的樂趣

本文約2100字,預計閱讀7分鐘

很多天前我們學習了二叉樹,忘記的小夥伴們可以看一下哦:

二叉樹我們想一下假如說一棵樹是這樣的:

[3,

9,20,null,null,15,

7]

這棵樹應該長這樣:

3

/ \ 9

20/ \

157

二叉樹的後序遍歷是比較複雜的,複雜在哪呢?

最重要的問題就是,節點的值該何時列印的問題。對於前序遍歷來說,每一次直接列印然後找右子樹和左子樹,不停地列印棧頂元素就行。對於中序遍歷來說,如果左子樹始終有結點存在,那麼第乙個輸出的結點門就應該是最左下角的那個,所以當我們把根節點壓入棧的時候,我們就需要不斷地把左邊界壓入棧,即不停地

temp=temp.left;
直到找到的那個結點為空為止,這個時候就彈出這個結點,開始找這顆子樹的右結點的左子樹(雖然講的非常變扭,其實自己畫個圖就好)然後不停地找左子樹

為什麼要不停地找左子樹呢?很簡單,中序遍歷最先需要遍歷的就是左子樹的左孩子,但是乙個結點對於自己的左孩子來說其實就是父親,不能第乙個列印,因此必須不停地找左孩子

最後棧為空時,停止

那麼對於後序遍歷來說,同樣是根節點壓棧,但是什麼時候列印根節點呢?

我一開始是這樣想的,如果也是先壓右節點,再壓左節點,這樣是符合遍歷的順序的,但是什麼時候開始列印呢?應該是根節點左子樹的最左邊的葉子結點開始列印.既然這樣,我們就先找到那個第乙個需要列印的結點,然後從棧裡面列印就行。

其實這是不合理的,當我們先壓右節點,再壓左節點的時候,此時再想壓右節點的孩子就不方便了。這個時候,我們有兩種解決方案:

第乙個就是再開乙個棧,我們去改變它的壓入的順序,先不停地壓左節點,再壓右節點,每一次彈出到第二個棧裡面,就可以保證所有的結點都可以找到,然後利用第二個棧去列印。

第二個就是,有標記的去壓棧,現在最麻煩的就是這個結點的左孩子和右孩子有沒有列印過,我們知道只要根節點列印過了,那麼就不需要去找這個結點的左右孩子了。相當於額外使用乙個指標,代表上一次列印的結點。

//非遞迴的後序遍歷

//選擇兩個棧的方法

#include

void

posorder

(node root)

stack stack1;

stack stack2;

//vectorresult;

// 先把根節點壓棧

stack.

push

(root)

; node cur;

while

(!stack1.

empty()

)// 再壓右節點

if(root.right !=

null)}

while

(!stack2.

empty()

) cout<<

" "<}

//二叉樹的後序遍歷

//只使用乙個棧的情況

#include

void

posorder

(node root)

stack sta;

sta.

push

(root)

; node cur=

null

;//root 是上一次列印過的結點

//cur 是當前的棧頂結點

while

(!sta.

empty()

)//考慮右子樹是否需要壓棧

else

if(c.right !=

null

&& h!=cur.right)

else

}printf

("\n");

}

這個過程不好想,看了好久才弄懂,哎慢慢來,以後精力就在這方面了。

好了,今天的二叉樹的後序遍歷就到這裡。

釋然每天發布一點自己學習的知識,希望1年後我們也能在acm的賽場上見面,一起去追尋自己的程式猿之路吧!

後期也會和大家一起分享學習心得和學習經驗呢,明天我們不見不散哦!

近期預告:

線段樹、樹狀陣列、狀壓dp、trie樹、圖論

二叉樹的後序遍歷

1 問題描述 給出一棵二叉樹,返回其節點值的後序遍歷。給出一棵二叉樹 1 2 3返回 3,2,1 2 問題實現 與前序遍歷 中序遍歷類似。若二叉樹為空,則空操作返回。否則後序遍歷根節點的左子樹,後序遍歷根節點的右子樹,訪問根節點。3 definition of treenode class tree...

二叉樹的後序遍歷

節點和樹類 public class treenode public treenode integer val override public string tostring public class tree 遞迴實現 public arraylistafter treenode node aft...

二叉樹的後序遍歷

如下圖表示一顆二叉樹,對它進行先序遍歷操作,採用兩種方法,遞迴和非遞迴操作。遍歷結果為 4526731。1 遞迴操作 思想 若二叉樹為空,返回。否則 1 後序遍歷右子樹 2 後序遍歷左子樹 3 遍歷根節點 void postorder bitree root 2 非遞迴操作 void postord...