数据结构 二叉树

简介: 数据结构 二叉树

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;
    }
}


相关文章
|
9天前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
34 12
|
9天前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
33 10
|
9天前
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
31 2
|
23天前
|
数据库
数据结构中二叉树,哈希表,顺序表,链表的比较补充
二叉搜索树,哈希表,顺序表,链表的特点的比较
数据结构中二叉树,哈希表,顺序表,链表的比较补充
|
2月前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
111 4
|
2月前
|
C语言
【数据结构】二叉树(c语言)(附源码)
本文介绍了如何使用链式结构实现二叉树的基本功能,包括前序、中序、后序和层序遍历,统计节点个数和树的高度,查找节点,判断是否为完全二叉树,以及销毁二叉树。通过手动创建一棵二叉树,详细讲解了每个功能的实现方法和代码示例,帮助读者深入理解递归和数据结构的应用。
168 8
|
3月前
|
存储 算法 关系型数据库
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
这篇文章主要介绍了多路查找树的基本概念,包括二叉树的局限性、多叉树的优化、B树及其变体(如2-3树、B+树、B*树)的特点和应用,旨在帮助读者理解这些数据结构在文件系统和数据库系统中的重要性和效率。
39 0
数据结构与算法学习二一:多路查找树、二叉树与B树、2-3树、B+树、B*树。(本章为了解基本知识即可,不做代码学习)
|
3月前
|
存储 算法 搜索推荐
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
这篇文章主要介绍了顺序存储二叉树和线索化二叉树的概念、特点、实现方式以及应用场景。
50 0
数据结构与算法学习十七:顺序储存二叉树、线索化二叉树
|
3月前
|
Java
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(二)
38 1
|
3月前
|
算法 Java C语言
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
【用Java学习数据结构系列】震惊,二叉树原来是要这么学习的(一)
32 1

热门文章

最新文章