二叉樹的各種遍歷方法(非遞迴)

2021-08-21 07:29:36 字數 1317 閱讀 3894

#include#include#include#includeusing namespace std;

typedef  char elemtype;

typedef struct  btnode

btnode,*binarytree;

非遞迴就是利用棧的特性(先進後出),來進行模擬棧

void nicepreorder(btnode *p)

}} coutwhile(p != null || !st.empty())

btnode *node = st.top();st.pop();

coutp = node->rightchild;

} cout《方法一:

//後序遍歷

//後序遍歷遞迴定義:先左子樹,後右子樹,再根節點。

//後序遍歷的難點在於:需要判斷上次訪問的節點是位於左子樹,還是右子樹。

//若是位於左子樹,則需跳過根節點,先進入右子樹,再回頭訪問根節點;

//若是位於右子樹,則直接訪問根節點。

void nicelaorder(btnode *p)

btnode *node = st.top();st.pop();

if(node->rightchild == null || node->rightchild == tag)

else

} cout《方法二:

//要保證根結點在左孩子和右孩子訪問之後才能訪問,因此對於任一結點p,先將其入棧。

//如果p不存在左孩子和右孩子,則可以直接訪問它;

//或者p存在左孩子或者右孩子,但是其左孩子和右孩子都已被訪問過了,則同樣可以直接訪問該結點。

//若非上述兩種情況,則將p的右孩子和左孩子依次入棧

//這樣就保證了每次取棧頂元素的時候,左孩子在右孩子前面被訪問

//左孩子和右孩子都在根結點前面被訪問。

void nice_last_order(btnode *ptr)

else

if(ptr->leftchild!=null)

}}}

//二叉樹的層序遍歷

//二叉樹的層序遍歷,由於其層級的關係,需要借助佇列實現,從左到右,自上而下

//一次將二叉樹的各個結點入隊,這樣便可以保證輸出的順序是層序排列的

void level_order(btnode *ptr)

qu.push(ptr);

while(!qu.empty())

if(ptr->rightchild!=null)

}}

二叉樹各種遞迴非遞迴層次遍歷

typedef struct bitnode bitnode,bitree 注意這裡面的下方的bitnode代表 struct bitnode bitree代表 struct bitnode的指標 直接上程式 沒有什麼特別的難點,除了後序非遞迴遍歷需要些2個棧進行維護可能處理需要操作多一點,考研不容...

非遞迴方法遍歷二叉樹

思路 前序遍歷由圖示是先一里路向左全遞迴壓棧並且邊壓棧邊列印,直到左指標為空,然後得到棧頂指標,並出棧,找該棧頂結點的右結點,如果不為空,同樣的一路左遞迴壓棧,邊壓棧邊列印,直到左指標為空,然後重複,最後棧為空停止。借用棧實現回到前乙個結點 非遞迴遍歷 void btreeprevordernonr...

二叉樹遍歷的非遞迴方法

2.先序遍歷。非遞迴先序遍歷的思路如下 1.先將根節點入棧 2.訪問根節點 3.如果根節點存在右孩子,則將右孩子入棧 4.如果根節點存在左孩子,則將左孩子入棧 注意 一定是右孩子先入棧,然後左孩子入棧 5.重複2 4 先序遍歷非遞迴 public void preorder2 if p.left n...