二叉樹的三種非遞迴遍歷

2021-09-24 14:10:55 字數 803 閱讀 8679

中序遍歷

後序遍歷

非遞迴必會用到棧吶!

void

preorder

(btnode *b)

//如果左節點不存在

if(top)}}

}

1)訪問p節點,並將p節點入棧;

2)如果左節點存在,則讓p指向左節點,迴圈1步驟

3)左節點不在了,則出棧一次,讓棧頂元素等於目前節點的親節點,藉此讓p指標指向這個左節點的兄弟。

4)如果右節點存在,就繼續1,2,3步驟

5)如果右節點不存在,則再次出棧,棧頂元素等於該節點的親節點的親節點。

6)直到p指向空且棧空才結束。

void

inorder

(btnode *b)

if(top)}}

}

1)將p節點入棧;

2)如果左節點存在,則讓p指向左節點,迴圈1步驟

3)左節點不在了,則列印該節點並出棧一次,讓棧頂元素等於目前節點的親節點,藉此讓p指標指向這個左節點的兄弟。

4)如果右節點存在,就繼續1,2,3步驟

5)如果右節點不存在,則再次出棧,棧頂元素等於該節點的親節點的親節點。

6)直到p指向空且棧空才結束。

與先序唯一的不同就是列印的位置

void

postorder

(btnode *b)

else

if(p->lchild!=

null)}

}}

二叉樹的三種非遞迴遍歷

一.前序遍歷 前序遍歷按照 根結點 左孩子 右孩子 的順序進行訪問。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 ...