二叉樹專題 lintcode非遞迴遍歷與總結

2021-08-09 11:56:53 字數 1012 閱讀 6721

我們有了將節點入棧2次的想法。第一次出棧,只是作為乙個中間量,為了通過這個量進入到右子樹,第二次出棧,訪問,便實現了後序的要求。當然,若乙個節點沒有右子樹,只入棧一次,訪問完左子樹後,直接訪問根就好了。

下面給出**,並用例子說一些細節問題

void getresult(vector& result,treenode * root)

//執行到這裡時,表示已經走到了當前子樹的最左側,p為null

treenode* q=null;//表示上一次訪問的節點

只寫了一部分執行的流程,與我們分析的是一致的,關鍵在於從左子樹跳到右子樹的那條break語句

我們由分析可以看出來:

要想後序遍歷一棵二叉樹,首先要指標不斷向左側走,並訪問路徑;上例中,訪問完了b為根的子樹,那麼跳到c,要處理以c為根的子樹,必然要從c開始不斷向左走

故向右跳的時候需要一條break語句,來終止不停的出棧

1.程式是否執行的判斷條件

先序中序

後序棧非空,p非空

棧非空,p非空

棧非空

原因:根左右,左根右的訪問順序,p指標最後是訪問右子樹,最後p會指向最右側的那個null,故棧為空,p不為空是仍然要執行,兩者都空才結束

而對於後序遍歷,最後訪問的是最最上面的根,不需要對p的判斷

2.遞迴遍歷與非遞迴遍歷的一致性

遞迴中,左根右,根左右,左右根,無論哪種訪問順序,最先都是向左子樹遞迴,故非遞迴寫法中首先也是指標不斷向左側走。我們只是用棧模擬了遞迴中的入棧出棧。

想明白了這些,感覺非遞迴的寫法也不是很難的,都是一一對應的,根據遞迴的流程直接轉換過來就好。

二叉樹專題 lintcode二叉樹的層序遍歷

層序遍歷算是遍歷方式中,比較容易掌握的,實質就是寬度優先遍歷,bfs的基本 塊如下 void bfs 放到二叉樹的遍歷中來看,首先根節點入隊,根出隊,訪問根節點,再入隊左孩子,入隊右孩子 這樣再出隊時,就是訪問的第二層的左側.以此類推 我們來看看題目考察的方式 由以上的分析,容易想到先取到這一層的元...

二叉樹專題

一般的樹 struct node node newnode int v void search node root,int x,int newdata if root data x search root lchild,x,newdata search root rchild,x,newdata 注...

LintCode 等價二叉樹

題目描述 檢查兩棵二叉樹是否等價。等價的意思是說,首先兩棵二叉樹必須擁有相同的結構,並且每個對應位置上的節點上的數都相等。樣例 1 1 2 2 and 2 2 4 4 就是兩棵等價的二叉樹。1 1 2 3 and 2 3 4 4就不是等價的。做題思路 本題給出的bool型別的函式來判斷二叉樹是否等價...