DS二叉树--二叉树构建与遍历(含代码框架)

题目描述

给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果

 

 

输入

第一行输入一个整数t,表示有t个二叉树

第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行

输出

输出每个二叉树的先序遍历、中序遍历和后序遍历结果

输入样例1

2
AB0C00D00
AB00C00
 

输出样例1

ABCD
BCAD
CBDA
ABC
BAC
BCA
 

#include<iostream>
#include<string>
using namespace std;

class BiTreeNode {
public:
    char data;  //结点数据
    BiTreeNode* LeftChild; //左子树指针
    BiTreeNode* RightChild;  //右子树指针
    BiTreeNode() :LeftChild(NULL), RightChild(NULL) {}
    ~BiTreeNode() {}
};

class BiTree {
private:
    BiTreeNode* Root;//根节点指针
    int pos;
    string strTree;
    BiTreeNode* CreateBiTree();
    void PreOrder(BiTreeNode* t);
    void InOrder(BiTreeNode* t);
    void PostOrder(BiTreeNode* t);
public:
    BiTree() {}; //构造函数
    ~BiTree() {};//析构函数
    void CreateTree(string TreeArray);//利用先序遍历解雇构建二叉树
    void PreOrder();//前序遍历
    void InOrder();//中序遍历
    void PostOrder();//后序遍历
};
//构造二叉树,利用先序遍历结果建树
void BiTree::CreateTree(string TreeArray) {//公有函数,对外接口
    pos = 0;
    strTree.assign(TreeArray);
    Root = CreateBiTree();
}

BiTreeNode* BiTree::CreateBiTree()//递归建树,私有函数,类内实现
{
    BiTreeNode* T;
    char ch;
    ch = strTree[pos++];
    if (ch == '0')
        T = NULL;
    else
    {
        T = new BiTreeNode();
        T->data = ch;//生成根节点
        T->LeftChild = CreateBiTree();//构造左子树
        T->RightChild = CreateBiTree();//构造右子树
    }
    return T;
}
//定义先序遍历函数
void BiTree::PreOrder() { //公有函数,对外接口
    PreOrder(Root); 
}

void BiTree::PreOrder(BiTreeNode* t)
{//私有函数,类内实现
    if (t)//若结点不为空
    {
        cout << t->data;//输出当前结点t的数据
        PreOrder(t->LeftChild);//先序遍历t的左孩子
        PreOrder(t->RightChild);//先序遍历t的右孩子
    }
}
//定义中序遍历函数
void BiTree::InOrder() { //公有函数,对外接口
    InOrder(Root); 
}

void BiTree::InOrder(BiTreeNode* t)
{//私有函数,类内实现
    if (t)//若结点t不为空
    {
        InOrder(t->LeftChild);//中序遍历t的左孩子
        cout << t->data;//输出当前结点t的数据
        InOrder(t->RightChild);//中序遍历t的右孩子
    }
}
//后序遍历函数
void BiTree::PostOrder() { //公有函数,对外接口
    PostOrder(Root); 
}

void BiTree::PostOrder(BiTreeNode* t)
{//私有函数,类内实现
    if (t)//若结点t不空
    {
        PostOrder(t->LeftChild);//后序遍历t的左孩子
        PostOrder(t->RightChild);//后序遍历t的右孩子
        cout << t->data;//输出当前结点t的数据
    }
}
//主程序
int main()
{
    int t;//用来记录输入的整数t,表示有t个二叉树
    string s;//用来记录二叉树的先序遍历结果
    cin >> t;
    for (int i = 0; i < t; i++)
    {
        cin >> s;
        BiTree BT;
        BT.CreateTree(s);//建树
        BT.PreOrder();//先序遍历
        cout << endl;
        BT.InOrder();//中序遍历
        cout << endl;
        BT.PostOrder();//后序遍历
        cout << endl;
    }
    return 0;
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值