#include #include struct bintreenode;
//以下**用於建樹,便於測試中序遍歷程式是否正確
struct bintreenode* createnode(int data)
return temp;
}struct bintreenode* findnode(struct bintreenode* bintree,int data)//查詢
//假設每個節點值不同
#define left 1
#define right 0
struct bintreenode* insertnode(struct bintreenode* bintree,int loc,int dir,int data)//插入節點,loc代表插入的數的父節點的值,dir表示方向
return bintree;
}//二叉樹前序遍歷的迭代實現,用到棧
/*思路:
後序不同於前序和中序,後序要訪問完左子樹和右子樹才能訪問節點;
因此遍歷到乙個節點,訪不訪問他取決於它的左右子樹是不是均被訪問過了;
需要在結構體中加入乙個用來判斷的變數visited,如果其左右子樹均被訪問過,就賦值為1
過程:當前節點,沿它的左路徑,開始遍歷,直到路徑末尾,開始回溯
回溯過程中的節點的左兒子一定被訪問過了或者不存在,如果其右兒子不存在或者右兒子已經被訪問過,訪問當前節點
如果其右兒子存在,此時以其右兒子為基礎,再去遍歷其左路徑
*/void postordertrversal(struct bintreenode* bintree)
while(flag&&top>=0)
else}}
return;
}int main()
//不用flag也可以
#include #include struct bintreenode;
//以下**用於建樹,便於測試中序遍歷程式是否正確
struct bintreenode* createnode(int data)
return temp;
}struct bintreenode* findnode(struct bintreenode* bintree,int data)//查詢
//假設每個節點值不同
#define left 1
#define right 0
struct bintreenode* insertnode(struct bintreenode* bintree,int loc,int dir,int data)//插入節點,loc代表插入的數的父節點的值,dir表示方向
return bintree;
}//二叉樹前序遍歷的迭代實現,用到棧
/*思路:
後序不同於前序和中序,後序要訪問完左子樹和右子樹才能訪問節點;
因此遍歷到乙個節點,訪不訪問他取決於它的左右子樹是不是均被訪問過了;
需要在結構體中加入乙個用來判斷的變數visited,如果其左右子樹均被訪問過,就賦值為1
過程:當前節點,沿它的左路徑,開始遍歷,直到路徑末尾,開始回溯
回溯過程中的節點的左兒子一定被訪問過了或者不存在,如果其右兒子不存在或者右兒子已經被訪問過,訪問當前節點
如果其右兒子存在,此時以其右兒子為基礎,再去遍歷其左路徑
*/void postordertrversal(struct bintreenode* bintree)
if(top>=0)
else
temp=stack[top]->right;}}
return;
}int main()
二叉樹的迭代後序遍歷
一 1.將左結點入棧,直至左結點為空 2.判斷右結點 1 若右結點不為空且右結點未被訪問過,則將右結點按照和左結點相同的規則入棧 2 若右結點為空或已被訪問過,則將當前結點輸出,出棧並進行標記 從分支再次進入迴圈,若從 1 進入,則繼續入棧 若從 2 進入,則跳過入棧階段,將當前棧頂置為當前結點 v...
二叉樹的後序遍歷 迭代
使用兩個棧來協助完成二叉樹的遍歷操作。不難發現,如果我們以 根 右 左 的順序遍歷二叉樹,將結果壓進棧中,彈棧的時候順序就是 左 右 根 也就是後序遍歷的結果了。而 根 右 左 的遍歷順序和先序遍歷很像 先序遍歷是 根 左 右 用stack1協助,對每個結點依次將 根 右 左 的順序入棧,最後將遍歷...
二叉樹前中後序遍歷迭代實現
二叉樹遍歷迭代實現 迭代用棧實現 遞迴的原理就是棧,每次呼叫乙個方法就會開闢乙個棧幀,而每個棧幀的返回順序也是按照後進先出的順序。所以基於這個原理,任何遞迴能解決的問題都可以轉換為迭代去實現。只需記住一點 棧是先進後出。前序是根 左 右,那麼棧的入棧順序是根 此時進行出棧操作並新增到結果 右 左 中...