6-2 二叉树创建及遍历

实现二叉树创建及遍历算法。

函数接口定义:

void CreateBiTree(BiTree &T);//根据输入的字符串,创建二叉树。 
void PreOrder(BiTree T);//先序遍历二叉树 
void InOrder(BiTree T);//中序遍历二叉树 
void PostOrder(BiTree T);//后序遍历二叉树 
void LevelOrder(BiTree T);//层次遍历二叉树

其中 T 表示二叉树类型。

裁判测试程序样例:

#include<iostream>
using namespace std;
typedef struct BiNode{
    char data;
    struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;

void CreateBiTree(BiTree &T);//根据输入的字符串,创建二叉树。 
void PreOrder(BiTree T);//先序遍历二叉树 
void InOrder(BiTree T);//中序遍历二叉树 
void PostOrder(BiTree T);//后序遍历二叉树 
void LevelOrder(BiTree T);//层次遍历二叉树  

int main(){
 BiTree T;
 CreateBiTree(T);
 cout<<"PreOrder:"; 
 PreOrder(T);
 cout<<endl<<"InOrder:";
 InOrder(T);
 cout<<endl<<"PostOrder:";
 PostOrder(T);
 cout<<endl<<"LevelOrder:";
 LevelOrder(T);
 return 0;
} 
/* 请在这里填写答案 */

输入样例:

AB#C##D#EF###

输出样例:

输出拓扑序列。

PreOrder:ABCDEF
InOrder:BCADFE
PostOrder:CBFEDA
LevelOrder:ABDCEF 

函数:

void CreateBiTree(BiTree& T) {//根据输入的字符串,创建二叉树
    char ch;
    cin >> ch;
    if (ch == '#') {
        T = NULL;//此指针置空
    }
    else {
        T = new BiTNode;//为指针指向地址创造空间
        T->data = ch;//数据域赋值
        CreateBiTree(T->lchild);//递归左儿子
        CreateBiTree(T->rchild);//递归右儿子
    }
}
void PreOrder(BiTree T) {//先序遍历二叉树 
    if (T) {//当此指针不为空时
        cout << T->data;//输出其数据域
        PreOrder(T->lchild);//进入递归
        PreOrder(T->rchild);
    }
}
void InOrder(BiTree T) {//中序遍历二叉树 
    if (T) {
        InOrder(T->lchild);
        cout << T->data;
        InOrder(T->rchild);
    }
}
void PostOrder(BiTree T) {//后序遍历二叉树 
    if (T) {
        PostOrder(T->lchild);
        PostOrder(T->rchild);
        cout << T->data;
    }
}
void LevelOrder(BiTree T) {//层次遍历二叉树
    BiTree stack[80];//创造一个可以存80个节点的指针数组
    int front, real = 0;//头和尾初始化0;
    front = real;
    BiTree curr, pre;//创造pre(pre处理当前指针)curr(curr处理左右儿子指针)
    pre = T;//头 pre指向T的头结点。
    while (pre != NULL) {
        // 输出当前节点的值 
        cout << pre->data;
        // 拿到当前节点的左孩子指针 
        curr = pre->lchild;
        //如果左孩子不为空 入队!
        if (curr != NULL) {
            stack[real++] = curr;
        }
        // 如果右孩子不为空 入队! 
        curr = pre->rchild;
        if (curr != NULL) {
            stack[real++] = curr;

        }
        // 如果队列不为空则从队列取出元素 
        if (front != real)
            pre = stack[front++];
        else //否则直接置空指针 
            pre = NULL;
    }
}

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值