#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...