二叉樹的遞迴遍歷比較簡單,這裡就不說了。二叉樹非遞迴的實現要依賴棧,其中,後序遍歷的非遞迴實現稍微複雜些。這裡總結下,便於理解。
好了,不多說了,直接上**,思路都在注釋裡。
#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次函式呼叫,這將極大地增加程式執行時間。這時,應該採取非遞迴便利二叉...