数据结构 二叉树

简介: 数据结构 二叉树

1. DS二叉树–二叉树构建与遍历


题目描述


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


a8943e4fd22a41c8b99ea8a8703103dc.png


本题目的代码框架参考如下

6186bd91398f43a6b620fac45a0751a2.png

三种遍历的代码框架

46338e6c032b40b3884af80134cd7c94.png

主函数如下:

75b6e421ecbc40c082121f999b33606c.png


输入


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


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


输出


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


输入样例


2

AB0C00D00

AB00C00


输出样例


ABCD

BCAD

CBDA

ABC

BAC

BCA


参考代码

#include <iostream>
using namespace std;
class treenode
{
public:
    char data;
    treenode *left;
    treenode *right;
    treenode()
    {
        data = '0';
        left = NULL;
        right = NULL;
    }
};
class tree
{
public:
    void create(treenode *&p)
    {
        char word;
        cin >> word;
        if (word != '0')
        {
            p = new treenode();
            p->data = word;
            create(p->left);
            create(p->right);
        }
        else
        {
            p = NULL;
        }
    }
    void preorder(treenode *p)
    {
        if (p != NULL)
        {
            cout << p->data;
            preorder(p->left);
            preorder(p->right);
        }
    }
    void inorder(treenode *p)
    {
        if (p != NULL)
        {
            inorder(p->left);
            cout << p->data;
            inorder(p->right);
        }
    }
    void postorder(treenode *p)
    {
        if (p != NULL)
        {
            postorder(p->left);
            postorder(p->right);
            cout << p->data;
        }
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        tree p;
        treenode *root;
        p.create(root);
        p.preorder(root);
        cout << endl;
        p.inorder(root);
        cout << endl;
        p.postorder(root);
        cout << endl;
    }
}

2. DS二叉树–叶子数量


题目描述


计算一颗二叉树包含的叶子结点数量。


提示:叶子是指它的左右孩子为空。


建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。

11c1c3bd82ed47a599ea471731dc8757.png


输入

第一行输入一个整数t,表示有t个测试数据


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


输出


逐行输出每个二叉树的包含的叶子数量


输入样例


3

AB0C00D00

AB00C00

ABC00D00E00


输出样例


2

2

3


参考代码

#include <iostream>
using namespace std;
class treenode
{
public:
    char data;
    treenode *left;
    treenode *right;
    treenode()
    {
        data = '0';
        left = NULL;
        right = NULL;
    }
};
class tree
{
public:
    int count = 0;
    void create(treenode *&p)
    {
        char word;
        cin >> word;
        if (word != '0')
        {
            p = new treenode();
            p->data = word;
            create(p->left);
            create(p->right);
        }
        else
        {
            p = NULL;
        }
    }
    int preorder(treenode *p)
    {
        if (p != NULL)
        {
            if (p->left == NULL && p->right == NULL)
                count++;
            else
            {
                preorder(p->left);
                preorder(p->right);
            }
        }
        return count;
    }
    void inorder(treenode *p)
    {
        if (p != NULL)
        {
            inorder(p->left);
            cout << p->data;
            inorder(p->right);
        }
    }
    void postorder(treenode *p)
    {
        if (p != NULL)
        {
            postorder(p->left);
            postorder(p->right);
            cout << p->data;
        }
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        tree p;
        treenode *root;
        p.create(root);
        cout << p.preorder(root);
        cout << endl;
    }
}


3. DS二叉树——二叉树之父子结点


题目描述


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


编写程序输出该树的所有叶子结点和它们的父亲结点

c97ab8f1df584b6f9b14655d8132bca9.png


输入


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


第二行起,按照题目表示的输入方法,输入每个二叉树的先序遍历,连续输入t行


输出


第一行按先序遍历,输出第1个示例的叶子节点


第二行输出第1个示例中与叶子相对应的父亲节点


以此类推输出其它示例的结果


输入样例


3

AB0C00D00

AB00C00

ABCD0000EF000


输出样例


C D

B A

B C

A A

D F

C E


参考代码

#include <iostream>
#include <queue>
using namespace std;
class treenode
{
public:
    char data;
    treenode *left;
    treenode *right;
    treenode()
    {
        data = '0';
        left = NULL;
        right = NULL;
    }
};
class tree
{
public:
    queue<treenode *> leaves;
    queue<treenode *> pres;
    void create(treenode *&p)
    {
        char word;
        cin >> word;
        if (word != '0')
        {
            p = new treenode();
            p->data = word;
            create(p->left);
            create(p->right);
        }
        else
        {
            p = NULL;
        }
    }
    void preorder(treenode *p)
    {
        preordermethod(p, NULL);
        while (!leaves.empty())
        {
            cout << leaves.front()->data << " ";
            leaves.pop();
        }
        cout << endl;
        while (!pres.empty())
        {
            cout << pres.front()->data << " ";
            pres.pop();
        }
        cout << endl;
    }
    void preordermethod(treenode *leave, treenode *pre)
    {
        if (leave != NULL)
        {
            if (leave->left == NULL && leave->right == NULL)
            {
                leaves.push(leave);
                pres.push(pre);
            }
            else
            {
                preordermethod(leave->left, leave);
                preordermethod(leave->right, leave);
            }
        }
    }
    void inorder(treenode *p)
    {
        if (p != NULL)
        {
            inorder(p->left);
            cout << p->data;
            inorder(p->right);
        }
    }
    void postorder(treenode *p)
    {
        if (p != NULL)
        {
            postorder(p->left);
            postorder(p->right);
            cout << p->data;
        }
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        tree p;
        treenode *root;
        p.create(root);
        p.preorder(root);
    }
}


4. DS树–二叉树高度


题目描述


给出一棵二叉树,求它的高度。二叉树的创建采用前面实验的方法。


注意,二叉树的层数是从1开始


输入


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


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


输出


每行输出一个二叉树的高度


输入样例


1

AB0C00D00


输出样例


3


参考代码

#include <iostream>
using namespace std;
class treenode
{
public:
    char data;
    treenode *left;
    treenode *right;
    treenode()
    {
        data = '0';
        left = NULL;
        right = NULL;
    }
};
class tree
{
public:
    int count = 0;
    void create(treenode *&p)
    {
        char word;
        cin >> word;
        if (word != '0')
        {
            p = new treenode();
            p->data = word;
            create(p->left);
            create(p->right);
        }
        else
        {
            p = NULL;
        }
    }
    int preorder(treenode *p, int num)
    {
        if (p != NULL)
        {
            if (p->left == NULL && p->right == NULL && num > count)
            {
                count = num;
            }
            else
            {
                preorder(p->left, num + 1);
                preorder(p->right, num + 1);
            }
        }
        return count;
    }
    void inorder(treenode *p)
    {
        if (p != NULL)
        {
            inorder(p->left);
            cout << p->data;
            inorder(p->right);
        }
    }
    void postorder(treenode *p)
    {
        if (p != NULL)
        {
            postorder(p->left);
            postorder(p->right);
            cout << p->data;
        }
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        tree p;
        treenode *root;
        p.create(root);
        cout << p.preorder(root, 1);
        cout << endl;
    }
}


5. DS二叉树——二叉树之数组存储


题目描述


二叉树可以采用数组的方法进行存储,把数组中的数据依次自上而下,自左至右存储到二叉树结点中,一般二叉树与完全二叉树对比,比完全二叉树缺少的结点就在数组中用0来表示。,如下图所示


从上图可以看出,右边的是一颗普通的二叉树,当它与左边的完全二叉树对比,发现它比完全二叉树少了第5号结点,所以在数组中用0表示,同样它还少了完全二叉树中的第10、11号结点,所以在数组中也用0表示。


结点存储的数据均为非负整数


输入


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


第二行起,每行输入一个数组,先输入数组长度,再输入数组内数据,每个数据之间用空格隔开,输入的数据都是非负整数


连续输入t行


输出


每行输出一个示例的先序遍历结果,每个结点之间用空格隔开


输入样例


3

3 1 2 3

5 1 2 3 0 4

13 1 2 3 4 0 5 6 7 8 0 0 9 10


输出样例


1 2 3

1 2 4 3

1 2 4 7 8 3 5 9 10 6


参考代码

#include <iostream>
#include <queue>
using namespace std;
class treenode
{
public:
    int data;
    treenode *left;
    treenode *right;
};
class tree
{
public:
    void create(treenode *&p)
    {
        int word;
        cin >> word;
        if (word != 0)
        {
            p = new treenode();
            p->data = word;
            create(p->left);
            create(p->right);
        }
        else
        {
            p = NULL;
        }
    }
    void levelcreate(treenode *&p, int num)
    {
        queue<treenode *> l;
        int count = 0;
        int data;
        cin >> data;
        count++;
        if (data)
        {
            p = new treenode();
            p->data = data;
            l.push(p);
        }
        else
        {
            p = NULL;
        }
        while (!l.empty() && count < num)
        {
            treenode *node = l.front();
            cin >> data;
            int flag = 0;
            count++;
            if (data)
            {
                node->left = new treenode();
                node->left->data = data;
                l.push(node->left);
                flag = 1;
            }
            else
            {
                node->left = NULL;
            }
            cin >> data;
            count++;
            if (data)
            {
                node->right = new treenode();
                node->right->data = data;
                l.push(node->right);
                flag = 1;
            }
            else
            {
                node->right = NULL;
            }
            if (flag)
                l.pop();
        }
    }
    void preorder(treenode *p)
    {
        if (p != NULL)
        {
            cout << p->data << " ";
            preorder(p->left);
            preorder(p->right);
        }
    }
};
int main()
{
    int t;
    cin >> t;
    while (t--)
    {
        tree p;
        treenode *root;
        int num;
        cin >> num;
        p.levelcreate(root, num);
        p.preorder(root);
        cout << endl;
    }
}


相关文章
|
19天前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
70 8
|
1月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
23 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
1月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
25 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
1月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
28 1
|
1月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
25 1
|
1月前
|
存储
【数据结构】二叉树链式结构——感受递归的暴力美学
【数据结构】二叉树链式结构——感受递归的暴力美学
|
1月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
1月前
|
存储 算法 调度
数据结构--二叉树的顺序实现(堆实现)
数据结构--二叉树的顺序实现(堆实现)
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(三)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解
|
1月前
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解(二)
【高阶数据结构】二叉树进阶探秘:AVL树的平衡机制与实现详解