#头歌 算法 应用经典二叉树编程-Falling Leaves(中文版)

第1关:Falling Leaves(中文版)

背景

图1显示了字母二叉树的图形表示。熟悉二叉树的人可以跳过字母二叉树、二叉树叶子和字母二叉搜索树的定义,直接进入问题。

字母二叉树可能是以下两种情况之一:

  1. 它可能是空的。
  2. 它可能有一个根节点。节点以字母作为数据,并指向左子树和右子树。左子树和右子树也是字母二叉树。

在字母二叉树的图形表示中:

  1. 空树被完全省略。
  2. 每个节点由—1)它的字母数据,2)一条往左到左子树的线段,如果左子树非空,3)如果右子树非空,则往右到右子树的线段。

二叉树中的叶子是子树都为空的节点。在图 1 的示例中,这将是具有数据 B、D、H、PY 的五个节点。

字母树的前序遍历满足以下定义性质:

  1. 如果树为空,则预序遍历为空。
  2. 如果树不为空,则预序遍历按顺序由以下内容组成—1)来自根节点的数据,2)对根的左子树进行前序遍历,3)根的右子树的前序遍历。

图 1 中树的预序遍历是 KGCBDHQMPY

图1所示的树也是字母的二叉搜索树。字母二叉搜索树是一个字母二叉树,其中每个节点满足:

  1. 根节点的数据在字母表中的位置比左子树节点中的所有数据都要晚。

  2. 根节点的数据比右子树中所有节点的数据更早出现。

题目描述

考虑以下字母二叉搜索树的操作序列

  1. 删除叶子并列出删除的数据。
  2. 重复此过程,直到树为空。

从下面左边的树开始,我们生成所示的树序列,然后通过删除带有数据的叶子来生成空树。

 
  1. BDHPY
  2. CM
  3. GQ
  4. K

您的问题是从字母二叉搜索树中的这样一行叶子序列开始,并输出树的前序遍历。

输入格式

输入将包含一个或多个数据集。每个数据集都是由一行或多行大写字母组成的序列。 这些行包含在上面描述的阶段中从二叉搜索树中移除的叶子。一行中的字母将按字母顺序递增排列。数据集由仅包含星号(*)的行分隔。 最后一个数据集后面的行只包含一个美元符号($)。输入中没有空格或空行。

输出格式

对于每个输入数据集,都有一个唯一的二叉搜索树,它将产生叶序列。输出是一行,只包含该树的预序遍历,没有空格。

输入输出样例

输入
 
  1. BDHPY
  2. CM
  3. GQ
  4. K
  5. *
  6. AC
  7. B
  8. $
输出
 
  1. KGCBDHQMPY
  2. BAC

截止后通关代码

#include<iostream>

#include<cstring>

#include<string>

using namespace std;

struct data{

   

    int l , r;

    char c;

}tree[110];

int cnt = 1;

void insert(int t , char ch){

   

    if(!tree[t].c){

        tree[t].c = ch;

        return;

    }

   

    if(ch < tree[t].c){

       

        if(!tree[t].l){

            tree[++cnt].c = ch;

            tree[t].l = cnt;

        }

        else{

            insert(tree[t].l , ch);

        }

    }

    if(ch > tree[t].c){

       

        if(!tree[t].r){

            tree[++cnt].c = ch;

            tree[t].r = cnt;

        }

        else{

            insert(tree[t].r , ch);

        }

    }

}

void preorder(int t){

   

    if(!tree[t].c){

       

        return;

    }

    cout << tree[t].c;

    preorder(tree[t].l);

    preorder(tree[t].r);

}

int main(){

   

    string s1 , s;

    while(1){

       

        s = "";

        memset(tree , 0 ,sizeof(tree));

        while(cin >> s1 && s1[0] != '*' && s1[0] != '$'){

           

            s += s1;

        }

       

        for(int i = s.length() - 1; i >= 0 ; i --){

           

            insert(1, s[i]);

        }

        preorder(1);

       

        cout << endl;

        if(s1[0] == '$'){

           

            break;

        }

    }

   

}

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
二叉树的遍历算法是指按照某种顺序访问二叉树中的所有节点。常见的遍历算法有三种:前序遍历、中序遍历和后序遍历。下面分别介绍这三种遍历算法应用: 1.前序遍历:先访问节点,再访问左子树,最后访问右子树。前序遍历的应用包括: - 创建二叉树:可以据前序遍历序列和中序遍历序列构建一棵二叉树。 - 表达式求值:可以据前序遍历序列将表达式转换为二叉树,然后对二叉树进行后序遍历求值。 - 复制二叉树:可以据前序遍历序列和中序遍历序列复制一棵二叉树。 2.中序遍历:先访问左子树,再访问节点,最后访问右子树。中序遍历的应用包括: - 二叉搜索树的排序:对于一棵二叉搜索树,中序遍历序列是有序的,因此可以通过中序遍历将二叉搜索树中的元素按照从小到大的顺序输出。 - 表达式转换:可以据中序遍历序列将中缀表达式转换为后缀表达式。 - 二叉树的线索化:可以通过中序遍历将二叉树线索化,使得每个节点都有一个前驱节点和后继节点。 3.后序遍历:先访问左子树,再访问右子树,最后访问节点。后序遍历的应用包括: - 表达式求值:可以据后序遍历序列将表达式转换为二叉树,然后对二叉树进行后序遍历求值。 - 后序遍历销毁二叉树:可以通过后序遍历销毁一棵二叉树。 - 计算二叉树的深度:可以通过后序遍历计算一棵二叉树的深度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值