爱问知识人 爱问教育 医院库

二叉树的非递归遍历

首页

二叉树的非递归遍历

任务:建立一棵二叉树,要求分别用递归和非递归方法实现二叉树的先序、中序和后序遍历。求高手解答啊

提交回答

全部答案

    2018-05-15 04:38:04
  •   哈,我们数据结构的实验:
    typedef int Status;
    typedef int TElemType;
    typedef struct BiTNode
    {
    TElemType data;
    struct BiTNode *lchild, * rchild;//左右孩子指针
    }BiTNode, *BiTree;
    typedef struct SqQueue
    {
    TElemType front ,rear ;
    BiTree data[MAXQSIZE]; //循环队列元素类型为二叉链表结点指针
    int count;
    }SqQueue; //循环队列结构定义
    int stack[MAX_TREE_SIZE],top=0;
    Status CreateBiTree(BiTree *T)
    {
    //按先序输入二叉树中的结点的值(一个字符),空格字符表示空树
    //构造二叉链表表示的二叉树T
    TElemType input;
    if(!(*T=(BiTree)malloc(sizeof(BiTNode)))) exit(OVERFLOW);
    fflush(stdin);
    if(!fscanf(in,"%d",&input))
    {
    printf("Read Data Error!");
    getch();
    exit(0);
    }
    if(input==-1)
    {
    *T = NULL;
    return FALSE;
    }
    else
    {
    (*T)->data=input;
    //printf("%d",input);
    CreateBiTree(&(*T)->lchild);
    CreateBiTree(&(*T)->rchild);
    }
    return OK;
    }
    Status PreOrderTraverse(BiTree T)
    {
    //先序遍历二叉树T的递归算法
    if (T)
    {
    printf("%d ",T->data);
    if(T->lchild) PreOrderTraverse(T->lchild);
    if(T->rchild) PreOrderTraverse(T->rchild);
    return FALSE;
    }
    else return OK;
    }
    Status PreOrder(BiTree T)
    {
    //先序遍历二叉树T的非递归算法
    while(!(T==NULL&&top==NULL))
    {
    if(T)
    {
    printf("%d ",T->data);
    push(T);
    T=T->lchild;
    }
    else
    {
    T=(BiTree)pop();
    T=T->rchild;
    }
    }
    }
    Status InOrderTraverse(BiTree T)
    {
    //中序遍历二叉树T的递归算法
    if (T)
    {
    if (T->lchild) InOrderTraverse(T->lchild);
    printf("%d ",T->data);
    if (T->rchild) InOrderTraverse(T->rchild);
    return FALSE;
    }
    else return OK;
    }
    Status InOrder(BiTree T)
    {
    //中序遍历二叉树T的非递归算法
    while(!(T==NULL&&top==NULL))
    {
    while(T)
    {
    push(T);
    T=T->lchild;
    }
    T=(BiTree)pop();
    printf("%d ",T->data);
    T=T->rchild;
    }
    }
    Status PostOrderTraverse(BiTree T)
    {
    //后序遍历二叉树T的递归算法
    if (T)
    {
    if (T->lchild) PostOrderTraverse(T->lchild);
    if (T->rchild) PostOrderTraverse(T->rchild);
    printf("%d ",T->data);
    return FALSE;
    }
    else return OK;
    }
    Status PostOrder(BiTree T)
    {
    //后序遍历二叉树T的非递归算法
    unsigned sign;//记录结点从栈中弹出的次数
    while(!(T==NULL&&top==NULL))
    {
    if(T)
    {
    push(T);//第一次遇到结点T时压入其指针
    push(1);//置标志为1
    T=T->lchild;
    }
    else
    {
    while(top)
    {
    sign=pop();
    T=(BiTree)pop();
    if(1==sign)//表示走过T的左子树
    {
    push(T);
    push(2);
    T=T->rchild;
    break;
    }
    else
    {
    if(2==sign)//表示T的左右子树都已走过
    {
    printf("%d ",T->data);
    T=NULL;
    }
    }
    }
    }
    }
    }。
      

    压***

    2018-05-15 04:38:04

类似问题

换一换

相关推荐

正在加载...
最新资料 推荐信息 热门专题 热点推荐
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200

热点检索

  • 1-20
  • 21-40
  • 41-60
  • 61-80
  • 81-100
  • 101-120
  • 121-140
  • 141-160
  • 161-180
  • 181-200
返回
顶部
帮助 意见
反馈

确定举报此问题

举报原因(必选):