开发者社区 问答 正文

层次序的非递归遍历算法的实现代码(C语言)..

应该不难吧,一定要用C语言啊,带点注释,采纳时会继续提高悬赏的!

展开
收起
知与谁同 2018-07-16 12:03:22 2808 分享 版权
1 条回答
写回答
取消 提交回答
  • 12535

    是二叉链表的层次遍历吧。 #include <stdlib.h>
    //定义动态分配空间的二叉链表类型
    typedef struct BiTNode{
     char data;
     struct BiTNode *lchild,*rchild;
    }BiTNode,*BiTree;
    //层次遍历输出二叉链表的所有结点的值
    void LevelOrderTraverse(BiTree T){
     typedef struct PNode{
      BiTNode *ptr;struct PNode *next;
     }PNode;//定义链表结点类型,链表的数据域存放二叉链表结点的指针
     PNode *R,*L,*p;
     if(T){
      R=(PNode*)malloc(sizeof(PNode));//建立第一个链表结点
      if(!R){
       printf("\nLevelOrderTraverse Error: Failed To MALLOC Memory!");
       return;
      }
      R->ptr=T;R->next=NULL;//R指向尾结点,尾结点指针域必须为空
      L=R;p=L;//L指向链表头结点
      while(p){//p结点的数据域指向当前处理的二叉链表结点
       printf("%c",p->ptr->data);
       if(p->ptr->lchild){//如果有左孩子,添加一个结点
        R->next=(PNode*)malloc(sizeof(PNode));
        if(!(R->next)){
         printf("\nLevelOrderTraverse Error: Failed To MALLOC Memory!");
         return;
        }
        R=R->next;R->ptr=p->ptr->lchild;R->next=NULL;//R重新指向尾结点,尾结点的数据域为当前处理的二叉链表结点的左孩子指针
       }
       if(p->ptr->rchild){//如果有右孩子,添加一个结点
        R->next=(PNode*)malloc(sizeof(PNode));
        if(!(R->next)){
         printf("\nLevelOrderTraverse Error: Failed To MALLOC Memory!");
         return;
        }
        R=R->next;R->ptr=p->ptr->rchild;R->next=NULL;
       }
       L=p->next;//L指向下一个链表结点,准备释放p结点
       free(p);//释放p结点
       p=L;//p重新指向链表头结点
      }
     }
    }

    这里使用了队列结构来存储某个结点的孩子结点。

    2019-07-17 22:55:32
    赞同 展开评论