ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树专题整理(未完结)

2021-12-19 20:31:01  阅读:152  来源: 互联网

标签:right TreeNode 未完结 int 专题 二叉树 整理 NULL left


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

题目描述
给定一颗二叉树的逻辑结构如下图,(先序遍历的结果,空树用字符‘0’表示,例如AB0C00D00),建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果
在这里插入图片描述
输入
第一行输入一个整数t,表示有t个二叉树
第二行起输入每个二叉树的先序遍历结果,空树用字符‘0’表示,连续输入t行

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

输入样例

2
AB0C00D00
AB00C00

输出样例

ABCD
BCAD
CBDA
ABC
BAC
BCA

C++ 代码

#include <iostream>
using namespace std;

string str;
int pos;

struct TreeNode{
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode():left(NULL), right(NULL){}
    TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};

TreeNode* make_tree(TreeNode* h){
    char ch =  str[pos++];
    if (ch == '0') return NULL;
    else {
       h = new TreeNode(ch);
       h->left = make_tree(h->left);
       h->right = make_tree(h->right);
    }
    return h;
}

void PreOrder(TreeNode* h){
    cout << h->val;
    if (h->left) PreOrder(h->left);
    if (h->right) PreOrder(h->right);
}

void InOrder(TreeNode* h){
    if (h->left) InOrder(h->left);
    cout << h->val;
    if (h->right) InOrder(h->right);
}

void PosOrder(TreeNode* h){
    if (h->left) PosOrder(h->left);
    if (h->right) PosOrder(h->right);
    cout << h->val;
}


int main(){
    int t;
    cin >> t;

    while (t--){
        TreeNode* head;
        cin >> str;
        pos = 0;
        head = make_tree(head);
        PreOrder(head);
        cout << endl;
        InOrder(head);
        cout << endl;
        PosOrder(head);
        cout << endl;
    }

    return 0;
}

B. DS二叉树–叶子数量

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

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

建树方法采用“先序遍历+空树用0表示”的方法,即给定一颗二叉树的先序遍历的结果为AB0C00D00,其中空节点用字符‘0’表示。则该树的逻辑结构如下图。
在这里插入图片描述
输入
第一行输入一个整数t,表示有t个测试数据

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

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

输入样例

3
AB0C00D00
AB00C00
ABC00D00E00

输出样例

2
2
3

C++ 代码

#include <iostream>
using namespace std;

string str;
int pos;
int ans;

struct TreeNode{
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode():left(NULL), right(NULL){}
    TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};

TreeNode* make_tree(TreeNode* h){
    char ch =  str[pos++];
    if (ch == '0') return NULL;
    else {
       h = new TreeNode(ch);
       h->left = make_tree(h->left);
       h->right = make_tree(h->right);
    }
    return h;
}

void PreOrder(TreeNode* h){
    if (h->left) PreOrder(h->left);
    if (h->right) PreOrder(h->right);
    if (!h->left && !h->right) ans++;
}



int main(){
    int t;
    cin >> t;

    while (t--){
        ans = 0;
        TreeNode* head;
        cin >> str;
        pos = 0;
        head = make_tree(head);
        PreOrder(head);
        cout << ans;
        cout << endl;
    }

    return 0;
}

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

题目描述

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

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

在这里插入图片描述
输入
第一行输入一个整数t,表示有t个二叉树

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

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

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

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

输入样例

3
AB0C00D00
AB00C00
ABCD0000EF000

输出样例

C D 
B A 
B C 
A A 
D F 
C E 


C++ 代码

#include <iostream>
using namespace std;

string str;
string son, fa;
int pos;
int ans;

struct TreeNode{
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode():left(NULL), right(NULL){}
    TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};

TreeNode* make_tree(TreeNode* h){
    char ch =  str[pos++];
    if (ch == '0') return NULL;
    else {
       h = new TreeNode(ch);
       h->left = make_tree(h->left);
       h->right = make_tree(h->right);
    }
    return h;
}

void PreOrder(TreeNode* h){
    if (h->left){
        if (!h->left->left && !h->left->right){
            fa += h->val;
            son += h->left->val;
        }
        PreOrder(h->left);
    }
    if (h->right){
        if (!h->right->left && !h->right->right){
            fa += h->val;
            son += h->right->val;
        }
        PreOrder(h->right);
    }
}



int main(){
    int t;
    cin >> t;

    while (t--){
        son.clear();
        fa.clear();
        ans = 0;
        TreeNode* head;
        cin >> str;
        pos = 0;
        head = make_tree(head);
        PreOrder(head);
        for (int i = 0; son[i]; ++i) cout << son[i] << " ";
        cout << endl;
        for (int i = 0; fa[i]; ++i) cout << fa[i] << " ";
        cout << endl;
    }

    return 0;
}

D. DS树–二叉树高度

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

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

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

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

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

输入样例

1
AB0C00D00

输出样例

3


C++ 代码

#include <iostream>
using namespace std;
string str;
int pos;
int high;

struct TreeNode{
    char val;
    TreeNode* left;
    TreeNode* right;
    TreeNode():left(NULL), right(NULL){}
    TreeNode(char ch):val(ch), left(NULL), right(NULL){}
};

TreeNode* make_tree(TreeNode* h){
    char ch = str[pos++];

    if (ch == '0') h = NULL;
    else {
        h = new TreeNode(ch);
        h->left = make_tree(h->left);
        h->right = make_tree(h->right);
    }

    return h;
}

void Level(TreeNode* h){
    TreeNode* q[100];
    int hh = 0, tt = -1;
    q[++tt] = h;

    while (hh <= tt){
        int sz = tt-hh + 1;

        while (sz--){
            auto t = q[hh++];
            if (t->left) q[++tt] = t->left;
            if (t->right) q[++tt] = t->right;
        }
        high++;
    }
}

int main(){
    int t;
    cin >> t;

    while (t--){
        cin >> str;
        pos = 0;
        high = 0;
        TreeNode* head = make_tree(head);
        Level(head);
        cout << high << endl;
    }

    return 0;
}

E. 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 

提示
注意从数组位置和二叉树深度、结点位置进行关联,或者父子结点在数组中的位置存在某种管理,例如i, i+1, i/2, i+1/2…或者2i, 2i+1…仔细观察哦

C++ 代码

#include <iostream>
using namespace std;
const int N = 1e5+10;
int n;
int nums[N];

struct TreeNode{
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode():val(-1), left(NULL), right(NULL){}
    TreeNode(int x):val(x), left(NULL), right(NULL){}
};

TreeNode* make_tree(int u){
    TreeNode* t;
    if (nums[u] == 0) t = NULL;
    else {
        t = new TreeNode(nums[u]);
        if (2*u <= n) t->left = make_tree(2*u);
        if (2*u+1 <= n) t->right = make_tree(2*u+1);
    }

    return t;
}

void PreOrder(TreeNode* h){
    cout << h->val << " ";
    if (h->left) PreOrder(h->left);
    if (h->right) PreOrder(h->right);
}

int main(){
    int t;
    cin >> t;

    while (t--){
        cin >> n;
        for (int i = 1; i <= n; ++i) cin >> nums[i];
        TreeNode* head;
        head = make_tree(1);
        PreOrder(head);
        cout << endl;
    }

    return 0;
}

标签:right,TreeNode,未完结,int,专题,二叉树,整理,NULL,left
来源: https://blog.csdn.net/weixin_50325452/article/details/122028882

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有