後序遍歷的非遞迴實現

2022-02-05 22:24:35 字數 848 閱讀 8024

1

//實現後序遍歷的非遞迴2//

核心:乙個結點需要彈出兩次,第一次彈出的時候還需要放回原位(左子樹遍歷完畢),第二次彈出的時候才輸出其值(右子樹遍歷完畢);34

5 #include 6 #include 7

using

namespace

std;89

struct

node ;

1516 typedef struct

node node;

1718

void init(node&head)

3940

intmain()

5556

//出棧

57if (p ==nullptr)

6869

繼續彈棧

70else74}

75}7677

return0;

78 }

關鍵點:

當該結點為非空,進行訪問左結點;

當這個元素出棧時,需要考慮其訪問次數:如果次數為1,那麼需要將其再次入棧,然後遍歷右子樹。如果次數為2,那麼表示以該節點為跟的子樹訪問完畢,置為null。

上述的核心遍歷**是對不同的結點以出棧和入棧為單位(遇到非空,進行入棧;遇到空,進行出棧,並進行完整的後序操作),每一次迴圈對乙個結點進行一次完整的操作。  而下列**主要是以一次操作為單位。

1

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

7else

13else

if(p->times==1

) 17

else21}

22 }

後序遍歷非遞迴演算法的實現

後序遍歷非遞迴演算法的實現 這個是在前面的基礎上,進行後序遍歷非遞迴演算法,這個演算法是很多求二叉樹路徑的基礎,比如求根結點到某點的路徑,或求兩個結點最近的公共祖先等。include include define maxsize 1000 using namespace std typedef st...

非遞迴的後序遍歷

利用中序和前序 int find char array,int size,char v return 1 node buildtree1 char preorder,char inorder,int size char rootvalue preorder 0 int leftsize find i...

樹的非遞迴後序遍歷

樹的後序遍歷特點 左 右 根 思路1 先序特點 逆序輸出 先序遍歷特點 根 左 右 在先序非遞迴遍歷 的基礎上可以實現 根 右 左 如果逆序輸出,就是 左 根 右 於是我們需要乙個另外的棧用來逆序輸出。template class t void binarytree postorder 後序遍歷 s...