刚才看到了一篇关于层序遍历二叉树的帖子,突然想到了自己数据结构作业中写的二叉树的遍历。现在看来,这些并不难了,当时却是费了很大的劲。
写了四种遍历方法——前中后序和层序,其中前中后序用到了栈,层序用到了队列。
- typedef struct node
- {
- char data;
- struct node *lchild;
- struct node *rchild;
- }BTreeNode;
- /
- //先序遍历
- /
- void PreOrder(BTreeNode *t)
- {
- InitStack(&s);
- BTreeNode *p;
- p = t->lchild;
- while(p != NULL || IsEmptyStack())//当前节点为非空或栈非空时循环
- {
- if(p != NULL)//非叶节点输出当前节点,右子树进栈,当前节点指向左子树
- {
- cout << p->data;
- PushStack(p->rchild);
- p = p->lchild;
- }
- else//当前节点为空时弹栈
- {
- p = PopStack();
- }
- }
- }
- /
- //中序遍历
- /
- void InOrder(BTreeNode *t)
- {
- BTreeNode *p;
- p = t->lchild;
- InitStack(&s);
- while(p!= NULL || IsEmptyStack())//当前节点为非空或栈非空时循环
- {
- if(p != NULL)//当前节点非空是进栈,当前节点指向左子树
- {
- PushStack(p);
- p = p->lchild;
- }
- else{//当前节点为空时弹栈,输出节点信息,当前节点指向左子树
- p = PopStack();
- cout << p->data;
- p = p->rchild;
- }
- }
- }
- /
- //后序遍历
- /
- void PostOrder(BTreeNode *t)
- {
- BTreeNode *p = NULL, *pr = NULL;
- p = t->lchild;
- InitStack(&s);
- while(p != NULL || IsEmptyStack())//当前节点非空或栈未空是循环
- {
- if(p!= NULL)//若当前节点非空则进栈,当前节点指向左子树
- {
- PushStack(p);
- p = p->lchild;
- }
- else{//当前节点为空时,指向栈顶节点的右子树
- p = s.stack[s.top];
- p = p->rchild;
- if(p == NULL || p == pr)//右子树未空,或右子树已输出,则弹栈,输出当前节点信息
- {
- p = PopStack();
- cout << p->data;
- pr = p;
- p = NULL;
- }
- }
- }
- }
- /
- //层序遍历
- /
- void LevelOrder(BTreeNode *t)
- {
- BTreeNode *p;
- p = t->lchild;
- InitQuene(&q);
- QueneEn(p);
- while(p != NULL && IsEmptyQuene())//当前节点非空且栈未空是循环
- {
- p = QueneOut();//出队,输出当前节点信息
- cout << p->data;
- if(p->lchild != NULL)//若左子树非空,左子树进栈
- QueneEn(p->lchild);
- if(p->rchild != NULL)//若右子树非空,右子树进栈
- QueneEn(p->rchild);
- }
- }