先序遍历
这个过程能总结出规律吗?(栈顶元素如果有左子树,则把左子树入栈,否则退出栈顶节点,并将其右子树入栈)
思路有了,程序写得出来了吧。注意,先序遍历节点入栈之前访问。
void PreOrderTraverse ( Bitree T ) { StackType S; BitreeNode * p; S.makeEmpty( ); p = T; do{ while ( p ) { printf ( p→data); S.Push(p); p = p→leftChild; } if ( !S.IsEmpty( ) ) { p = S.getTop( ); S.Pop( ); p = p→rightChild; } } while ( p || !S.IsEmpty( ) ); }
中序遍历
void InOrderTraverse ( Bitree T ) { StackType S; BitreeNode * p; S.makeEmpty( ); p = T; do{ while ( p ) { S.Push(p); p = p→leftChild; } if ( !S.IsEmpty( ) ) { p = S.getTop( ); S.Pop( ); printf ( p→data); p = p→rightChild; } } while ( p || !S.IsEmpty( ) ); }
后续遍历
后续遍历比较难,涉及到二次入栈,栈里面的节点有标志位,记录是第几次入栈。
typedef struct StackNode { enum tag{ L, R }; BitreeNode * ptr; } StackNode;
想想为什么要两次入栈?(第二次出栈的时候才访问节点)
void PostOrderTraverse ( Bitree T ) { StackType S; BitreeNode * p; StackNode w; S.makeEmpty( ); p = T; do { while ( p ) { w.ptr = p; w.tag = L; S.Push(w); p = p→leftChild; } int continue = 1; while ( continue && !S.IsEmpty( ) ) { w = S.getTop( ); S.Pop( ); p = w.ptr; switch (w.tag) { case L : w.tag = R; S.Push(w); continue = 0; p = p→rightChild; break; case R : printf (p→data); break; } } } while ( p || !S.IsEmpty( ) ); }
posted on 2010-07-11 10:41 江南烟雨hust 阅读(158) 评论(0) 收藏 举报