詳解二叉樹的遞迴遍歷與非遞迴遍歷 (二)

2021-09-25 20:29:28 字數 1624 閱讀 7865

typedef struct nodebtnode,*bitree;

1.前序遍歷

前序遍歷大體流程:

首先,掃瞄並訪問根結點1,(這裡用到乙個儲存節點的棧)然後將根結點儲存到棧中,並將根節點指向他的左孩子2(如果存在);

然後開始迴圈,每一次迴圈都訪問改結點,然後將該結點壓入棧中,一直迴圈到某一時刻的左孩子為null的 時候,也就是訪問到了a結點的左子樹中的最深層左孩子7;

則進行下一步,將結點指標指向該7的右孩子(如果存在),先訪問該結點,然後繼續訪問該右孩子的左子樹,重複第一步,就會一直自底向上的將1結點的左子樹訪問完畢;

最後,當回到1結點時,根結點1和他的左子樹已經全部遍歷完成,則開始遍歷右子樹了。流程和第3步類似。

**重現:

void  preorder(bitree  t)//if

//p為空跳到else表示已經訪問到了左子樹的最底層的那個左孩子;

//現在要做的是從下往上一次列印左右節點(實際上只有右節點了);

else

}//while

}//preorder

可以說從整個流程比較簡單。

2.中序遍歷

中序遍歷可以說是三種非遞迴遍歷最簡單的一種的。

中序遍歷大體流程:

1. 先掃瞄根結點(並非訪問根結點)的所有的左結點,並將它們一一入棧,直到掃瞄到最深層的左結點,即停止該操作。進而將棧頂元素彈出,這裡設為*p,(顯然 *p沒有左孩子結點或左孩子結點均已經被訪問郭),訪問它。然後掃瞄該結點的右孩子結點,將其進棧,在掃瞄該右孩子的所有結點並一一進棧,如此繼續,直到棧為空位置。

void inorder(bitree t)else

} }

3.後序遍歷

都說後續非遞迴是最難的。可是換個角度想想:你把最難的都掌握了,你就肯定不會比別人差,可能寫的不好,但是請看下去。

直接談後序遍歷的思想吧!

————後序遍歷就是先訪問左子樹,在訪問右子樹,最後訪問根結點,當用堆疊來儲存結點時,應該分清返回根節點時是從左子樹訪問返回的還是從右子樹返回的,

①因為如果是訪問了左子樹返回的,那麼久還需要去訪問右子樹;

②如果是從右子樹返回的,則可以直接訪問根結點了,這一點需要特別注意。

所以這裡借助輔助指標 prenode,指向醉經訪問過的結點。也可在結點中增加乙個標誌域,記錄是否已被訪問。

void postorder(bitree t)else//if

else//else

}//else向右結尾

}//while

}//postorder

總的來說,二叉樹的非遞迴遍歷相對遞迴遍歷是難理解一點的,但是非遞迴遍歷演算法的執行效率是要高於遞迴演算法的。希望大家無論遇到什麼演算法,都要靜下心來,去想,去實踐,去搜尋,只有這樣,才有提高。一起加油!!!

二叉樹的遞迴遍歷與非遞迴遍歷

二叉樹的遞迴遍歷與非遞迴遍歷 include include include 本程式實現二叉樹的建立,遞迴遍歷與非遞迴遍歷 typedef struct tnode tnode,pnode 構造二叉樹 pnode createtree else pnode data data pnode lchil...

二叉樹的遞迴遍歷與非遞迴遍歷

二叉樹的遍歷有遞迴與非遞迴兩種方式,但思想大致相同 前序 先列印然後遍歷完他的左子樹,左子樹為空時開始返回,並且開始以棧中元素為根遍歷右子樹 中序 先遍歷左子樹然後左子樹入棧,左子樹為空再列印,再遍歷右子樹 後序 先遍歷完左子樹,左子樹入棧儲存,再遍歷右子樹,遍歷完列印,否則繼續入棧 遞迴遍歷 遞迴...

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...