问题 I(1186): 【基础算法】以先序字符串方式建立二叉树

时间限制: 1 Sec  内存限制: 64 MB

题目描述

输入一个二叉树的先序串,输出其后序遍历结果。如果结点的子树为空,先序串的对应位置为空格符。

输入

第1行:先序串(结点数≤26,以单个大写字母表示)

输出

第1行:后序序列

样例输入

Copy (如果复制到控制台无换行,可以先粘贴到文本编辑器,再复制)

AB C  D  

样例输出

CBDA

提示

#------------------------------------------------------------------------------#
乍一看,貌似与以括号形式输出二叉树差不多,事实上,差得挺多……
括号输出是不需要建树的,而这道题现在(注意这里)是需要建树的,于是我们便开始建树。
把代码变成一段一段的显然不是我的风格,所以先讲思路。
首先肯定要存当前节点的左儿子和右儿子(结构体)。
输入字符串后,开始递归,如果当前节点没有左儿子,就把这个字符放到左儿子里,反之,再右儿子里,然后,只要当前字符不为空格,就继续递归。

这里要牵扯到字母,用一般的数组下标很麻烦,于是我又借此装了个逼——map数组上场
如果知道map的朋友可以跳过此处,这里大概讲讲map:
map其实是一种映射(不要问我映射是什么,我反正直接理解为储存),它的下标可以为任何变量——字符类,字符串(string)类,普通的数字,甚至结构体都行,它储存(我不说映射了)的内容也可以是任何变量。
就这样。
头文件:
#include<map>
using namespace std;
声明方式:
map <下标,储存类型> 数组名;
如:
map <string,int> a;
这样的话就可以这样用:
string x[10];
for(...)
{
cin>>x[i];
map[x[i]]=1;
}
就是这样了,关于map还有很多类似于find之类的函数很好用,以后再说吧
好了,建树就说完了,后序就不想说了,当然注意的是空格不要输出。
代码:
#include<map>
#include<cstdio>
#include<cstring>
using namespace std;
struct node
{char l,r;
};
map <char,node> tree;//定义一个下标为char,存储类型为node(结构体)的map数组
char a[300];
int len,x;
void f(char s)
{if(x==len) return;//如果长度到了returnchar c=a[x++];//当前字符存入(其实不存也行)if(!tree[s].l) tree[s].l=c;//左儿子else tree[s].r=c;//右儿子if(c!=' ') f(c);//递归找完左子树if(c!=' ') f(c);//右子树
}
void last(char g){//倒序输出这个很容易不讲了if(g){last(tree[g].l);last(tree[g].r);if(g!=' ')printf("%c",g);}
}
int main()
{fgets(a,300,stdin);//读入len=strlen(a);f(0);last(a[0]);
}

当然,有100多b的方法

其实,是不需要建树的,只用一个变量加递归就可以完成此题
超简单的方法:
读入一个字符,只要不是空格就再次递归,最后输出即可,因为一旦有了空格就代表当前结点的某一儿子为空,二叉树有两个儿子,所以递归两次便可以把左子树和右子树找完。
代码:
#include<cstdio>
void h()
{char c=getchar();//getchar一个一个处理if(c==' ')//是空格代表一个儿子没有了return;h();//找左子树h();//找右子树(此时已经遇到了一个空格,才会返回,进行这一步,说明左子树找完了)printf("%c",c);//打印
}
int main()
{h();
}

By WZY


                                                                                    
                                                                                                                                

转载于:https://www.cnblogs.com/LinqiongTaoist/p/7203742.html

【图论】【二叉树】以先序字符串方式建立二叉树相关推荐

  1. python构建二叉树_python--使用递归的方式建立二叉树

    树和图的数据结构,就很有意思啦. # coding = utf-8 class BinaryTree: def __init__(self, root_obj): self.key = root_ob ...

  2. 利用先序遍历输入法建立二叉树

    题目:假设二叉树结点的数据为字符,即 struct TreeNode { char Data; struct TreeNode * Left; struct TreeNode * Right; }; ...

  3. [算法] 已知前序和后序遍历,建立二叉树

    结点结构 typedef struct Node{char data;struct Node *left;struct Node *right; }Node; 已知前序和后序遍历,建立二叉树(不唯一, ...

  4. Leetcode 129求根节点到叶节点数字之和、104二叉树的最大深度、8字符串转换整数(atoi)、82删除排序链表中的重复元素II、204二分查找、94二叉树的中序遍历、144二叉树的前序遍历

    Top1:Leetcode 129求根节点到叶节点数字之和 官方题解:https://leetcode.cn/problems/sum-root-to-leaf-numbers/solution/qi ...

  5. [算法] 已知前序和中序遍历,建立二叉树

    结点结构 typedef struct Node{char data;struct Node *left;struct Node *right; }Node; 已知前序和中序遍历顺序,建立二叉树 问题 ...

  6. 建立二叉树:已知层次遍历顺序建立二叉树、已知先序遍历顺序建立二叉树

    其他二叉树知识!二叉树知识汇总 目录 前提知识: 约定: 二叉树节点的存储结构: 创建一个节点: 建立二叉树的几种方法: 一.已知先序遍历顺序,构建二叉树.(链式存储) 二.已知层次遍历顺序,构建二叉 ...

  7. 中序建立二叉树,非递归前序遍历二叉树

    内容: 编写程序,实现下述功能,并上机调试通过. 按中序顺序建立一棵二叉树: 用非递归方式遍历二叉树(先序),输出遍历序列. 步骤: 算法分析 采用二叉链表做存储结构,建立二叉树,借助于栈结构来实现二 ...

  8. 如何通过中序和层序序列建立二叉树

    有这样一棵二叉树 根据节点个数 9 层序遍历结果 15 23 8 16 2 32 28 7 11 中序遍历结果 16 23 7 32 11 2 28 15 8 预期先序输出 15 23 16 2 32 ...

  9. [LeetCode] Construct Binary Tree from Preorder and Inorder Traversal 由先序和中序遍历建立二叉树...

    Given preorder and inorder traversal of a tree, construct the binary tree. Note: You may assume that ...

最新文章

  1. stat_count() must not be used with a y aesthetic
  2. 【好书试读】支付宝体验设计精髓
  3. 制作alipay-sdk-java包到本地仓库
  4. ca开头的车是什么牌子_微电调研 | 把高速车摘了牌子当低速车卖还很普遍
  5. php图像处理原生函数,php图像处理函数imagecopyresampled的用法
  6. 拼图java监听器,Android 简单的实现滑块拼图验证码功能
  7. html图片上传阅览并且点击放大
  8. 【转载】Python tips: 什么是*args和**kwargs?
  9. ecshop简化购物流程
  10. html文章标题加粗,织梦去除推荐文章标题加粗标签的方法
  11. 怎么彻底卸载cad2017_彻底卸载CAD的方法图解步骤
  12. Access Token是做什么的
  13. 四季电台应用项目源码
  14. html5图片自动滑动,超简单的图片左右切换滑动
  15. xmind 使用教程
  16. 虚幻引擎5.1现已发布!
  17. chrome android 导航,将 Chrome for Android 的地址栏移动到屏幕下方[Android]
  18. 写了10篇产品分析后,我似乎知道怎么做一款短视频产品了……
  19. 从网红店到家居设计,“Ins风”正在无孔不入
  20. 一个自学前端的4年工作总结【三十而立,拒绝躺平】

热门文章

  1. Android Service演义
  2. Xposed源码剖析——概述
  3. 在数据库技术中脏数据是指_数据库安全关键技术之数据库加密技术
  4. python await原理_JavaScript async/await原理及实例解析
  5. 钱包系统推荐维金_区块链持币生息系统开发app,钱包系统搭建
  6. kettle读取json文件并读取数据_Labview打开Excel文件读取数据
  7. vc2010访问局域网mysql_VC2010利用MySQL++访问mysql. 及连接池示例
  8. 周志华眼中的贝叶斯方法(转)
  9. JZOJ__Day 5:【普及模拟】权势二进制
  10. BZOJ 4422 (线段树、DP、扫描线、差分)