二叉树的建立及遍历(二叉树)

论坛 期权论坛 编程之家     
选择匿名的用户   2021-6-2 20:56   2691   0

1.题目:

Problem Description

设有一棵二叉树,其节点值为字符型并假设各值互不相等,采用二叉链表存储表示。现输入其扩展二叉树的前序遍历序列,要求建立该二叉树,并对其进行层序遍历。

Input

第一行为一个整数n,表示以下有n组数据,每组数据占一行,为扩展二叉树的前序遍历序列。

Output

输出该二叉树的层序遍历序列,空二叉树则不输出任何信息。

Sample Input

2
AB#D##C##
ABD##E##C#F##

Sample Output

ABCD
ABCDEF

2.代码:

#include <iostream>
using namespace std;

const int MaxSize = 100; ///定义输入字符串的最大长度

///二叉树结点的定义及声明
struct BiNode {
    char data;   ///数据域
    BiNode* lchild, *rchild;  ///指针域,左右孩子
};

class BiTree
{

private:
    BiNode* root;   ///定义根节点
    BiNode* Creat();   ///构造函数调用
    void Release(BiNode* root);   ///析构函数调用

public:
    BiTree();   ///构造函数,建立一颗二叉树
    ~BiTree();   ///析构函数,释放二叉树个结点的存储空间
    BiNode* Getroot();   ///获得根节点
    void levord(BiNode* root);   ///广搜,然后是层序遍历

};

BiTree::BiTree()
{
    root = Creat();
}

BiTree::~BiTree()
{
    Release(root);
}

BiNode* BiTree::Getroot()
{
    return root;   ///获得根节点
}

BiNode* BiTree::Creat()
{
    char ch;
    cin >> ch; ///从键盘上接收前序序列
    BiNode* root;   ///根节点的定义
    if (ch == '#')
        root = NULL; ///如果跟结点为#,表示空的二叉树
    else {
        root = new BiNode; ///生成一个节点,
        root->data = ch; ///该结点的数据域为ch
        root->lchild = Creat(); ///递归建立左子树
        root->rchild = Creat(); ///递归建立右子树
    }
    return root;   ///每建立一个节点,都返回根节点
}

void BiTree::Release(BiNode* root)
{
    if (root) { ///如果根节点不为空
        Release(root->lchild);   ///释放左子树
        Release(root->rchild);   ///释放右子树
        delete root;   ///释放根节点
    }
}

void BiTree::levord(BiNode* root)
{
    int front = 0, rear = 0; ///采用顺序队列,并假定不会发生上溢
    BiNode* Q[MaxSize];   ///定义队列数组
    BiNode* q;   ///定义临时结点,作用是记录下要处理的结点
    if (root == NULL) ///判断结点是否为空
        return ;
    else {
        Q[rear++] = root; ///根节点入队
        while (front != rear) { ///头指针和尾指针不相等的话,队列才不为空
            q = Q[front++]; ///临时结点标记当前要处理的结点,++是指处理外后,出队
            cout << q->data; ///输入当前节点的数据
            if (q->lchild)  ///如果q的左孩子存在的话,
                Q[rear++] = q->lchild; ///左孩子入队
            if (q->rchild)  ///如果q的右孩子存在的话,
                Q[rear++] = q->rchild; ///右孩子入队
        }
    }
    cout << endl;
}

int main()
{
    int n;
    cin >> n;
    while (n--) {
        BiTree bt;   ///按扩展前序序列创建一棵二叉树
        BiNode* root = bt.Getroot(); ///x获得根节点
        bt.levord(root);   ///输出二叉树的层序遍历序列
    }

    return 0;
}


分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:3875789
帖子:775174
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP