二叉树:层次建树及先中后序遍历

二叉树的层次建树及先中后序遍历。(c++)

一、层次建立引用队列

二、遍历(采用递归)

  1. 先序遍历(深度优先遍历)

先打印自身,再打印左子树,再打印右子树。

  1. 中序遍历

先打印左子树,后打印自身,再打印右子树。

  1. 后序遍历

先打印左子树,再打印右子树,最后打印自身。

三、代码如下:

function.h代码如下:

#include <stdio.h>
#include <stdlib.h>
typedef char BiElemType;
typedef struct TNode{
    BiElemType d;
    TNode *lchild;
    TNode *rchild;
}TNode,*BiTree;
typedef struct tog{
    BiTree information;
    struct tog *inext;
}tog_t,*TQue;

函数的入口:

#include "function.h"
/**
 * abcdefghij
 * @return
 */
 /**
  *  abdhiejcfg
  *   hdibjeafcg
  *   hidjebfgca
  * @param tree
  */
 void PreOrder(BiTree tree){
     if(tree!=NULL){
         printf("%c",tree->d);
         PreOrder(tree->lchild);
         PreOrder(tree->rchild);
     }
 }
 void InOrder(BiTree tree){
     if(tree!=NULL){
         InOrder(tree->lchild);
         printf("%c",tree->d);
         InOrder(tree->rchild);
     }
 }
 void PostOrder(BiTree tree){
     if(tree!=NULL){
         PostOrder(tree->lchild);
         PostOrder(tree->rchild);
         printf("%c",tree->d);
     }
 }
int main() {
    BiTree tree;//定义一个树
    tree=NULL;//使树为空(没有任何根系)
    BiElemType element;//定义一个树的数据结构类型的变量,用来存放标准输入的数
    TQue front=NULL,rear=NULL,qnew,qcur=NULL;//队列的头指针、尾指针、新结点,指向父系结点的指针
    BiTree tnew;//树的新结点
    while(scanf("%c",&element)){ //层次建树
        if(element=='\n'){//回车结束
            break;
        }
        tnew=(BiTree)calloc(1,sizeof(TNode));//为树的新结点申请空间,空间大小为两个参数的乘积,并赋值为0(NULL)
        tnew->d=element;//将输入的值赋给树的新结点的数据域
        qnew=(TQue)calloc(1,sizeof(TNode));//同理
        qnew->information=tnew;//将树的新结点的地址存入队列新结点的数据域--换句话说通过队列间接访问树的新结点的数据域的值
        if(tree==NULL){//当树为空时,将根指向树的新结点,队列的头尾指针指向第一个结点,指向树的父系指针指向队列的第一个结点
            tree=tnew;
            front=qnew;
            rear=qnew;
            qcur=qnew;
        }else{
            rear->inext=qnew;//将队列的尾指针指向新结点
            rear=qnew;
            if(NULL==qcur->information->lchild){//如果某父亲结点没有左孩子则将左指针指向新结点
                qcur->information->lchild=tnew;
            }else if(NULL == qcur->information->rchild){//如果某父亲结点没有右孩子则将右指针指向新结点
                qcur->information->rchild=tnew;
                qcur=qcur->inext;
            }
        }
    }
    printf("----------------PreOrder---------------\n");
    PreOrder(tree);//深度优先遍历
    printf("\n");
    printf("----------------InOrder---------------\n");
    InOrder(tree);//中序遍历
    printf("\n");
    printf("----------------PostOrder---------------\n");
    PostOrder(tree);//后序遍历
    printf("\n");
    return 0;
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值