二叉樹的三種非遞迴遍歷方法

2021-09-02 11:38:57 字數 1117 閱讀 7296

//frontsearch函式用於前序遍歷二叉樹。

void

frontsearch

(binarytree *root)

//在將子節點進行入棧時,由於要先遍歷左節點,後遍歷右節點,所以要先將右節點入棧,再將做節點入棧。

}

//middlesearch函式用於中序遍歷二叉樹。

void

middlesearch

(binarytree *root)

//從根節點開始,將其極左子節點入棧。

node = s.

top();

//從最後乙個極左節點開始遍歷(第二次執行到此處時彈出該極左節點的父節點)

s.pop();

//寫相關程式以進行你想進行的操作(及遍歷完當前節點)。

node = node-

>right;

//程式第一次執行到此處時node為空指標,因為剛剛彈出的棧頂節點是最後乙個極左節點,其沒有子節點,

//程式第二次執行到此處時最後極左節點的父節點已經遍歷完畢,node賦值為其有子節點的位址。

}}

//backsearch函式用於後序遍歷二叉樹。

void

backsearch

(binarytree *root)

//與中序遍歷相同,,從根節點開始,將其極左子節點入棧。

while

(!s.

empty()

)//將該右子節點的所有左子孫節點入棧。

node = s.

top();

}//寫相關程式以進行你想進行的操作(即遍歷完當前節點)。

s.pop();

}}//後序遍歷中的sign[s,size()]通過當前棧中元素的個數的位置進行0或1的賦值,當遍歷完乙個右子節點後,

//會有元素從棧頂彈出,之後在sign陣列相對應的位置的值如果為0,則表示當前判斷的右子節點已經被遍歷過

//且不再遍歷,並且此時的node為該右子節點的父節點的位址,從而遍歷其;如果為1,則說明該右子節點沒有

//被遍歷,從而對其進行左子孫節點的判斷與壓棧以及自身的遍歷。

二叉樹的三種非遞迴遍歷

一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。1.遞迴實現 void preorder1 bintree root 遞迴前序遍歷 2.非遞迴實現 根據前序遍歷訪問的順序,優先訪問根結點,然後再分別訪問左孩子和右孩子。即對於任一結點,其可看做是根結點,因此可以直接訪問,訪問完之後...

二叉樹的三種非遞迴遍歷

遞迴演算法和非遞迴演算法的轉換 可以借助棧,將二叉樹的遞迴演算法轉換為非遞迴演算法,下面以中序遍歷為例給出中序遍歷的非遞迴演算法。先掃瞄 並非訪問 根結點的所有左結點並將他們一一進棧。然後出戰乙個結點 p 顯然結點 p沒有左孩子結點或者左孩子結點均已訪問過 則訪問它。然後掃瞄該結點的有孩子結點,將其...

二叉樹的三種非遞迴遍歷

struct treenode 一 前序輸出二叉樹 void preorder treenode root p stk.top stk.pop p p right 二 中序輸出二叉樹 void midorder treenode root p stk.top cout void postorder ...