利用栈实现,我这里是为了方便用了c++的stack。
定义树的结构体
typedef struct BiTNode{ char data; BiTNode *lchild, *rchild; }BiTNode,*BiTree;
先序遍历
先将左子树入栈,边入栈遍输出值,左子树入完后入右子树,再重复之前操作。
</pre><p><pre name="code" class="cpp"><pre name="code" class="cpp"><pre name="code" class="cpp">void PreOrder(BiTree T) //先序遍历的非递归 { if (!T) { return ; } stack<BiTree> s; while (T) // 左子树上的节点全部压入到栈中 { s.push(T); <pre name = "code" class = "cpp"><span style = "white-space:pre"> < / span > printf("%d ", temp->data); T = T->lchild; } while (!s.empty()) { BiTree temp = s.top()->rchild; { printf("%d ", temp->data); s.push(temp); temp = temp->lchild; } } }
中序遍历
先入栈左子树,再输出值,把栈顶的元素提出,访问它的右子树,再重复前面操作。
void InOrderTraverse1(BiTree T) // 中序遍历的非递归 { if(!T) return ; BiTree bt = T; // 指向当前要检查的节点 stack<BiTree> s; while(bt != NULL || !s.empty()) { while(bt != NULL) { s.push(bt); bt = bt->lchild; } if(!s.empty()) { bt = s.top(); s.pop(); printf("%d ",bt->data; bt = bt->rchild; } } }
后序遍历
void PostOrder_Nonrecursive1(BiTree T) { stack<BiTree> S; BiTree curr = T ; // 指向当前要检查的节点 BiTree previsited = NULL; // 指向前一个被访问的节点 while(curr != NULL || !S.empty()) // 栈空时结束 { while(curr != NULL) // 一直向左走直到为空 { S.push(curr); curr = curr->lchild; } curr = S.top(); // 当前节点的右孩子如果为空或者已经被访问,则访问当前节点 if(curr->rchild == NULL || curr->rchild == previsited) { cout<<curr->data<<" "; previsited = curr; S.pop(); curr = NULL; } else curr = curr->rchild; // 否则访问右孩子 } }