二叉树的中序遍历非递归算法

我会带着你远行 2022-03-28 10:55 336阅读 0赞

*非递归算法思想:

(1)设置一个栈S存放所经过的根结点(指针)信息;初始化S;

(2)第一次访问到根结点并不访问,而是入栈;

(3)中序遍历它的左子树,左子树遍历结束后,第二次遇到根结点,就将根结点(指针)退栈,并且访问根结点;然后中序遍历它的右子树。

(4) 当需要退栈时,如果栈为空则结束。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JpbGx5MTkwMA_size_16_color_FFFFFF_t_70

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JpbGx5MTkwMA_size_16_color_FFFFFF_t_70 1

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JpbGx5MTkwMA_size_16_color_FFFFFF_t_70 2

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L0JpbGx5MTkwMA_size_16_color_FFFFFF_t_70 3

代码实现:

  1. void Midorder(struct BiTNode *t) //t为根指针
  2. { struct BiTNode *st[maxleng];//定义指针栈
  3. int top=0 //置空栈
  4. do{
  5. while(t) //根指针t表示的为非空二叉树
  6. { if (top==maxleng) exit(OVERFLOW);//栈已满,退出
  7. st[top++]=t //根指针进栈
  8. t=t->lchild //t移向左子树
  9. } //循环结束表示以栈顶元素的指向为根结点的二叉树
  10. //的左子树遍历结束
  11. if (top) //为非空栈
  12. { t=st[--top]; //弹出根指针
  13. printf("%c",t->data); //访问根结点
  14. t=t->rchild //遍历右子树
  15. }
  16. } while(top||t); //父结点未访问,或右子树未遍历
  17. }

依照同样的思维,写的先序遍历非递归模式

  1. void Preorder(struct BiTNode * t){
  2. struct BiTNode * St[MaxSize], *p;
  3. int top = 0; //置空栈
  4. if (t! = NULL){
  5. St[top++] = t;
  6. while(top){
  7. p = St[--top]; printf("%c ", p->data);
  8. if(p->rchild != NULL)
  9. St[top++] = p->rchild;
  10. if(p->lchild != NULL)
  11. St[top++] = p->lchild;
  12. }
  13. printf("\n");
  14. }
  15. }

后序遍历

  1. void Postorder(struct BiTNode * t){
  2. struct BiTNode * St[MaxSize], *pre;
  3. int flag, top = 0;
  4. if (t != NULL){
  5. do{
  6. while(t != NULL){
  7. St[top++] = t; t = t->lchild;
  8. }
  9. pre = NULL; flag = 1;
  10. while(top && flag){
  11. t = St[top-1];
  12. if(t->rchild == pre){
  13. printf(“%c ”, t->data); top--; pre = t;
  14. }
  15. else{ t=t->rchild; flag = 0;}
  16. }
  17. }while(top);
  18. printf(“\n”);
  19. }
  20. }

发表评论

表情:
评论列表 (有 0 条评论,336人围观)

还没有评论,来说两句吧...

相关阅读