先實現棧
#include
#include
#include
typedef char elemtype;
#define stacksize 20
typedef struct st
stack;
void init_stack(stack *p);//初始化棧
bool is_empty(stack *p);//判斷是否為空棧
bool is_full(stack *p);//判斷棧是否為滿棧
int getlength(stack *p);//獲取棧內元素個數
bool push(stack *p, elemtype value);//入棧
elemtype top(stack *p);//彈出棧頂元素
elemtype pop(stack *p);//出棧
void show_stack(stack *p);//展示棧內元素
void init_stack(stack *p)
bool is_empty(stack *p)
return false;
}bool is_full(stack *p)
return false;
}int getlength(stack *p)
bool push(stack *p, elemtype value)
return res;
}//出棧操作分為兩步,是為了保證出棧精確
elemtype top(stack *p)
if ( p != null )
return p->data[p->top];
elemtype pop(stack *p)
}void show_stack(stack *p)
假設二叉樹的結構為:
則其前序遍歷為:abcdefgh. 中序遍歷為:cbedfagh . 後序遍歷為:cefdbhga
用棧實現中序遍歷的思想:從根節點開始,讓二叉樹左-中-右遍歷,若不為空則入棧,若為空出棧
過程如下所示:
將其轉化為**,如下:
void niceinorder ( btnode *ptr )
if ( null == ptr ) return ;
stack st;
init_stack ( &st ) ;
while ( ptr !=null || ! is_empty ( &st ) )
while ( ptr !=null )
push ( & st , ptr -> data ) ;
ptr = ptr -> liftchild ;
ptr = top ( &st ) ; pop( &st ) ; // 遇到空直接出棧
printf ( " %c ", ptr -> data ) ;
ptr = ptr -> rightchild ;
後序遍歷思想為:每個節點都要進棧兩次,第二次退棧是才訪問節點。第一次進棧時,在遍歷左子樹的過程中將根節點進棧,待左子樹訪問完後,回溯的節點退棧,即退出這個根節點,但不能立即訪問,只能借助於這個根去找該根的右子樹,並遍歷這棵右子樹,直到該右子樹全部遍歷以後,再退出該根節點,並訪問它。所以,為了記錄節點是第一次還是第二次進棧,需單獨定義乙個節點作為標誌。
**如下:
void nicepastorder ( btnode *ptr )
if ( null == ptr ) return ;
stack st;
init_stack ( &st ) ;
btnode *tag=null;
while ( ptr !=null || ! is_empty ( &st ) )
while ( ptr !=null )
push ( & st , ptr -> data ) ;
ptr = ptr -> liftchild ;
ptr = top ( &st ) ; pop( &st ) ; // 遇到空直接出棧
if ( ptr -> rightchild == null || ptr -> rightchild == tag )
printf ( "%c", ptr -> data ) ;
tag = ptr ;
ptr = null ;
else
push ( &st, ptr ) ;
ptr = ptr -> rightchild ;
前序遍歷的思想:若棧不為空且ptr不為空時入棧即出棧並列印,然後將其右孩子入棧,再繼續訪問其左孩子;若ptr為空,則出棧。
**如下:
void niceperorder ( btnode *ptr )
if ( ptr == null ) return ;
stack st ;
init_stack ( &st ) ;
while ( ptr !=null || ! is_empty ( &st ) )
if ( ptr )
push ( &st , ptr ) ;
ptr = top ( &st ) ; pop ( &st ) ;
printf ( "%c " , ptr -> data ) ;
push ( &st , ptr -> rightchild ) ;
ptr = ptr -> leftchild ;
else
ptr = top ( &st ) ; pop ( &st ) ;
遞迴 棧 非遞迴非棧實現二叉樹的遍歷
基於迎春花開365天 利用棧實現二叉樹的先序 中序 後序遍歷的非遞迴操作 以及 alvin qu 非遞迴,不用棧實現二叉樹中序遍歷 的演算法,本人對二叉樹的遍歷做出系統的總結 c 實現 包含先序 中序 後序的遞迴 棧實現 非遞迴非棧實現。其中以雙棧作為輔助資料結構的後序遍歷演算法,於jimolang...
用棧實現遞迴(二叉樹的遍歷)
一 先序遍歷 public void getnodebystack treenode node stack.push node while stack.isempty if treenode.left null 直接把棧中的top節點拉出來,然後先把有節點放入棧中,再放左節點 二 中序遍歷 publ...
二叉樹遍歷非遞迴實現(借助棧)
先序遍歷非遞迴實現 思路 使用棧來模擬遞迴的操作 迴圈條件 節點不為null,且棧不為空。如果當前節點不為空,把節點進棧,並且訪問節點 cout 節點指向其左孩子,直至左孩子為空。這時相當於左子樹已經遍歷完了,我們需要訪問右節點,將當前元素指向棧頂元素右孩子,彈出棧頂元素。c void preord...