二叉树练习实验

Posted 一腔诗意醉了酒

tags:

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

问题 A: DS树–二叉树高度

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

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

输入

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

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

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

样例输入
1
AB0C00D00
样例输出
3

#include<iostream>
#include<algorithm>

using namespace std;

class Node{
    public:
        char data;
        Node * lChild;
        Node * rChild;
        Node():lChild(NULL),rChild(NULL){};
        ~Node(){};
};

class BiTree{
    private:
        Node* root;
        string strTree;
        int pos;
        int depth;
        Node* create();
        void preOrder( Node *t);
        void getdepth(Node *t, int dp);
    public:
        void create(string s);
        void preOrder();
        int getdepth();
};

void BiTree::create(string s){
    strTree.assign(s);
    pos = 0;
    root = create();
}

Node* BiTree::create(){
    Node* T;
    char ch;
    ch = strTree[pos++];
    if( ch=='0' ){
        T = NULL;
    }
    else{
        T = new Node();
        T->data = ch;
        T->lChild = create();
        T->rChild = create();
    }
    return T;
}

void BiTree::preOrder(){
    preOrder(root);
}

void BiTree::preOrder( Node *t){
    if(t){
        cout<<t->data<<' ';
        preOrder(t->lChild);
        preOrder(t->rChild);
    }
}

int BiTree::getdepth(){
    depth = 0;
    getdepth(root,depth+1);
    return depth;
}

void BiTree::getdepth(Node *t, int dp){
    if(t){
        depth = max(depth,dp);
        getdepth(t->lChild,dp+1);
        getdepth(t->rChild,dp+1);
    }
};



int main(){
    int st;
    cin>>st;
    for(int i=0; i<st; i++){
        string ss;
        cin>>ss;
        BiTree *bt = new BiTree;
        bt->create(ss);
        // bt->preOrder();
        int d = bt->getdepth();
        cout<<d<<endl;
    }
    return 0;
}

问题 B: DS二叉树–二叉树之最大路径

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

二叉树的每个结点都有一个权值,从根结点到每个叶子结点将形成一条路径,每条路径的权值等于路径上所有结点的权值和。编程求出二叉树的最大路径权值。如下图所示,共有4个叶子即有4条路径,

路径1权值=5 + 4 + 11 + 7 = 27 路径2权值=5 + 4 + 11 + 2 = 22

路径3权值=5 + 8 + 13 = 26 路径4权值=5 + 8 + 4 + 1 = 18

可计算出最大路径权值是27。

该树输入的先序遍历结果为ABCD00E000FG00H0I00,各结点权值为:

A-5,B-4,C-11,D-7,E-2,F-8,G-13,H-4,I-1

在这里插入图片描述

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

第二行输入一棵二叉树的先序遍历,每个结点用字母表示

第三行先输入n表示二叉树的结点数量,然后输入每个结点的权值,权值顺序与前面结点输入顺序对应

以此类推输入下一棵二叉树

输出
每行输出每棵二叉树的最大路径权值,如果最大路径权值有重复,只输出1个

样例输入
2
AB0C00D00
4 5 3 2 6
ABCD00E000FG00H0I00
9 5 4 11 7 2 8 13 4 1
样例输出
11
27
提示


#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

int len;
int *a;
int road[99];
int uIndex;
class Node{
    public:
        char data;
        int num;
        Node * lChild;
        Node * rChild;
        Node():lChild(NULL),rChild(NULL){};
        ~Node(){};
};

class BiTree{
    private:
        Node* root;
        string strTree;
        int pos;
        int npos;
        int depth;
        Node* create();
        void preOrder( Node *t);
    public:
        void create(string s);
        void preOrder();
       
};

void BiTree::create(string s){
    strTree.assign(s);
    pos = 0;
    npos = 0;
    root = create();
}

Node* BiTree::create(){
    Node* T;
    char ch;
    int nu;
    ch = strTree[pos++];
    if( ch=='0' ){
        T = NULL;
    }
    else{
        T = new Node();
        nu = a[npos++];
        T->data = ch;
        T->num = nu;
        T->lChild = create();
        T->rChild = create();
    }
    return T;
}

void BiTree::preOrder(){
    preOrder(root);
}

void BiTree::preOrder( Node *t){
    if(t){

        if(t->lChild && t->rChild){
            t->lChild->num += t->num;
            t->rChild->num += t->num;
        }else if(t->lChild){
            t->lChild->num += t->num;
        }else if(t->rChild){
            t->rChild->num += t->num;
        }else{
            road[uIndex++] = t->num;
        }
        preOrder(t->lChild);
        preOrder(t->rChild);
    }
}



int main(){
    int st;
    cin>>st;
    for(int i=0; i<st; i++){
        memset(road,0,sizeof(road));
        uIndex = 0;
        string ss;
        cin >> ss;
        cin >> len;
        a = new int[len];
        for(int i=0; i<len; i++){
            cin >> a[i];
        }
        BiTree *bt = new BiTree;
        bt->create(ss);
        bt->preOrder();
        int ans = 0;
        for(int i=0; i<uIndex; i++){
            ans = max(ans,road[i]);
        }
        cout<<ans<<endl;
        delete a;
    }
    return 0;
}



以上是关于二叉树练习实验的主要内容,如果未能解决你的问题,请参考以下文章

二叉树练习题

二叉树练习题

二叉树练习题

数据结构二叉树经典OJ练习

每日一题||二叉树练习

数据结构C++实验题 程序代码?