用棧實現二叉樹的遍歷(非遞迴)

2021-08-08 12:21:31 字數 2895 閱讀 1432

先實現棧

#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...