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