非遞迴實現樹的前中後遍歷

2021-08-28 16:35:31 字數 1475 閱讀 1525

**銜接bst樹的**,可以放在一起執行測試

非遞迴先序:

先根遍歷的基本思想就是:輸出自己,輸出左子樹,輸出右子樹。

從根節點出發,向左依次輸出並進棧,當左孩子為空時,指標指向棧頂的右子樹, 然後出棧,對右子樹進行遍歷。

void pre_output_stack(node* root)

//到了從根節點出發,最左邊的節點

if (!s.empty()) //遍歷最左邊節點的右子樹,且最左節點出站

}}

中序遍歷:先左子樹,在右子樹。

明白了中根遍歷,先根遍歷就很容易理解,從根節點向左邊出發,一次出棧儲存,到了最左邊節點後,記錄棧頂t, 出棧輸出t,遍歷右子樹。

void mid_output_stack(node* root)

if (!s.empty())

}}

後序遍歷:先一次遍歷左右子樹,再輸出自己。

首先要注意到乙個規律,就是後序遍歷中如果乙個節點右孩子不空,那麼一定是先輸出右孩子,緊接著是該節點。

所以當遍歷完了左子樹後,直接看該節點的右孩子,若空,直接輸出,若不空,則要看右子樹自否輸出(沒有輸出就要繼續遍歷),若上乙個輸出節點是右子樹的根節點,那麼說明右子樹遍歷完畢,可以直接輸出。

所以相對於前序,中序遍歷,後序遍歷需要乙個標記記錄輸出節點的前驅節點。

void post_output_stack(node* root)

node* p = root;

stacks;

node* prev = null;

while (p || !s.empty())

if (s.top()->rch == null || s.top()->rch == prev) //若右孩子為空或已遍歷,輸出並出棧

else //沒有遍歷就遍歷右孩子

}}

void per(treenode *root)

while (!s.empty())

while (!s.empty() && s.top()->right == nullptr)

if (!s.empty())

}putchar(10);

}void mid(treenode* root)

while (!s.empty())

while (!s.empty() && s.top()->right == nullptr)

if (!s.empty())

}putchar(10);

}void post(treenode* root)

while (!s.empty())

while (!s.empty() && s.top()->right == nullptr)

}if (!s.empty())

}putchar(10);

}

樹的遍歷,前中後 層次遍歷非遞迴

存在記憶體洩漏,原因是沒有銷毀結點時記憶體釋放的處理.include include include include using namespace std class cbtnode typedef cbtnode btnode class cbtroot void xianxubianli1 遞...

二叉樹的前中後遍歷遞迴非遞迴實現

好吧,我終於把前中後 遞迴和非遞迴的都寫出來了。如下 不解釋 include includeusing namespace std struct btnode void assertbtn btnode root1,int a else 非遞迴前序遍歷 stack s pre void preord...

二叉樹遍歷實現(前中後層次 遞迴非遞迴)

一.前序遍歷 include include includeusing namespace std struct binarytreenode 遞迴實現 void preorder1 binarytreenode proot if proot m pright nullptr 非遞迴實現 void ...