数据结构 二叉树

Posted 上山打老虎D

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据结构 二叉树相关的知识,希望对你有一定的参考价值。

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

题目描述

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

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

三种遍历的代码框架

主函数如下:

输入

第一行输入一个整数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’表示。则该树的逻辑结构如下图。

输入

第一行输入一个整数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),建立该二叉树的二叉链式存储结构。

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

输入

第一行输入一个整数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;
        

以上是关于数据结构 二叉树的主要内容,如果未能解决你的问题,请参考以下文章

数据结构中二叉树的顺序存储结构代码怎么编写?

数据结构二叉树经典基础习题

数据结构 二叉树的简单理解和代码实现

求数据结构算法平衡二叉树实现代码

输出二叉树树形的数据结构程序代码怎么写

求数据结构(C语言版)建立二叉树的代码~~急~~谢谢了