二叉樹非遞迴遍歷

2021-06-07 11:35:13 字數 1887 閱讀 1964

二叉樹的遞迴遍歷比較簡單,這裡就不說了。二叉樹非遞迴的實現要依賴棧,其中,後序遍歷的非遞迴實現稍微複雜些。這裡總結下,便於理解。

好了,不多說了,直接上**,思路都在注釋裡。

#include#include#define maxsize 30

typedef struct bstreenodebstreenode;

//先得寫個簡單的int棧

typedef struct stackstack;

//-------- 棧的各種操作--------------------//

int isempty(stack *s)else

}int push(stack *s, bstreenode *node)

s->data[s->top++] = node;

return 1;

}bstreenode * pop(stack *s)

return s->data[--(s->top)];

}//------- 樹的各種操作 --------------------------//

//生成二叉查詢樹

bstreenode *insert(bstreenode *tree,bstreenode *n)else if(n->m_value < tree->m_value)else

return tree;

}//生成測試的二叉查詢樹

bstreenode * create();

int i;

bstreenode * tree=null;

for(i=0;im_value = data[i];

fresh->m_pleft = fresh->m_pright = null;

tree = insert(tree,fresh);

} return tree;

}void destroy(bstreenode *cnode)

}//description:非遞迴前序遍歷

//algorithm:

//沿著左指標訪問沿途經過的根節點,同時將右指標進棧,以便在遞迴訪

//問左子樹完成後能得到右子樹的根節點的位址,如此重複進行,直到棧空。

void preordertree(bstreenode *cnode)

cnode = cnode->m_pleft;

}else }}

//description:非遞迴中序遍歷

//algorithm:

//先沿著左指標走到二叉樹中最左下的結點,即左指標為空的結點,將沿

//途經過的根節點,指標進棧。當左指標為空時,從棧中取出根節點訪問,然後再跳

//到右子樹上。

void inordertree(bstreenode *cnode)

cnode=pop(&s);

//訪問該節點

printf("%d,",cnode->m_value);

//訪問右子樹

cnode = cnode->m_pright; }}

//description:非遞迴的後序遍歷

//algorithm:先沿著左指標走到二叉樹中最左下的結點,將沿途經過的根節點指標進

//棧,若右子樹為空,則彈棧並訪問根節點,否則,跳到右子樹上

void postordertree(bstreenode *cnode);//用於判斷該節點的右子樹是否已經被訪問過了!

stack s;

s.top=0;

while(cnode || !isempty(&s))

cnode = pop(&s);

if(cnode->m_pright && flag[s.top] ==0)else }}

int main()

二叉樹遍歷(遞迴 非遞迴)

二叉樹以及對二叉樹的三種遍歷 先根,中根,後根 的遞迴遍歷演算法實現,以及先根遍歷的非遞迴實現。node public class node public node left public node right public object value 遍歷訪問操作介面 public inte ce ...

二叉樹非遞迴遍歷

二叉樹非遞迴遍歷的幾個要點 1 不管前序 中序還是後序,它們的遍歷路線 或者說是回溯路線,先沿左邊一直走到盡頭,然後回溯到某節點,並跳轉到該節點的右孩子 如果有的話 然後又沿著這個有孩子的左邊一直走到盡頭 都是一樣的。2 明確每次回溯的目的。比如,前序回溯的目的是為了訪問右子樹 中序回溯的目的是為了...

非遞迴遍歷二叉樹

中序遞迴遍歷 void inordertrvdigui node pnode 然而,當樹的深度很大 比如16 時 假設為滿二叉樹 樹的節點數為 2 0 2 1 2 2 2 15 2 16 65536,遍歷整個二叉樹意味著有65536次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...