1.指针实现

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>using namespace std;#define maxn 100struct Node
{bool have_value;int value;/*节点结构体*/Node *left,*right;Node():have_value(false),left(NULL),right(NULL){}};/*全局变量写起来更方便*/
char s[maxn];
Node* root=NULL;
bool faile;/*用来防止内存泄漏*/
void remove_tree(Node* tree)
{if(tree==NULL) return;remove_tree(tree->left);remove_tree(tree->right);delete tree;
}/*创建新节点封装成函数*/
Node* newnode() { return new Node();}/*添加新节点的函数*/
void addnode(int v,char* s)
{int n=strlen(s);Node* u=root;for(int i=0;i<n;i++){if(s[i]=='L'){if(u->left==NULL)u->left=newnode();u=u->left;}else if(s[i]=='R'){if(u->right==NULL)u->right=newnode();u=u->right;}}if(u->have_value) faile=true;u->value=v;u->have_value=true;
}/*读入数据并创建树,成功返回true读到文件结尾则返回false*/
bool read_input()
{faile=false;remove_tree(root);root=newnode();for(;;){if(scanf("%s",s)!=1) return false;if(!strcmp(s,"()")) break;int v;sscanf(&s[1],"%d",&v);addnode(v,strchr(s,',')+1);}return true;
}/*宽度优先算法,用队列实现将结果存在向量中*/
bool bfs(vector<int>& ans)
{queue<Node*> q;ans.clear();q.push(root);while(!q.empty()){Node* u=q.front();q.pop();if(!u->have_value) return false;ans.push_back(u->value);if(u->left!=NULL) q.push(u->left);if(u->right!=NULL) q.push(u->right);}return true;
}int main()
{vector<int> v;while(read_input()){if(!bfs(v) || faile==true)printf("%d\n",-1);elsefor(vector<int>::iterator i = v.begin(); i != v.end(); ++i)printf("%d ",*i);cout<<endl;    }}

2.数组实现

#include <iostream>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>using namespace std;
#define maxn 1000bool have_value[maxn];
int tleft[maxn];
int tright[maxn];
int value[maxn];
char s[100];
bool faile;const int root=1;
int cnt;void newtree()
{tleft[root]=0;tright[root]=0;have_value[root]=false;cnt=root;
}int newnode()
{int u=++cnt;tleft[u]=0;tright[u]=0;have_value[u]=false;return u;
}void addnode(int v,char* s)
{int n=strlen(s);int u=root;for(int i=0;i<n;i++){if(s[i]=='L'){if(tleft[u]==0)tleft[u]=newnode();u=tleft[u];}else if(s[i]=='R'){if(tright[u]==0)tright[u]=newnode();u=tright[u];}}if(have_value[u]) faile=true;value[u]=v;have_value[u]=true;
}bool read_input()
{faile=false;newtree();for(;;){if(scanf("%s",s)!=1) return false;if(!strcmp(s,"()")) break;int v;sscanf(&s[1],"%d",&v);addnode(v,strchr(s,',')+1);}return true;
}bool bfs(vector<int>& ans)
{queue<int> q;ans.clear();q.push(root);while(!q.empty()){int u=q.front();q.pop();if(!have_value[u]) return false;ans.push_back(value[u]);if(tleft[u]!=0) q.push(tleft[u]);if(tright[u]!=0) q.push(tright[u]);}return true;
}int main()
{vector<int> v;while(read_input()){if(!bfs(v) || faile==true)printf("%d\n",-1);elsefor(vector<int>::iterator i = v.begin(); i != v.end(); ++i)printf("%d ",*i);cout<<endl;    }}

书上的接口写的太棒了,换了种实现方式,代码基本上没改,比我自己写的接口不知道高到哪里去了.

转载于:https://www.cnblogs.com/tclan126/p/7252781.html

第六章例题二叉树层次遍历相关推荐

  1. [LeetCode] Binary Tree Level Order Traversal 二叉树层次遍历(DFS | BFS)

    目录: 1.Binary Tree Level Order Traversal - 二叉树层次遍历 BFS 2.Binary Tree Level Order Traversal II - 二叉树层次 ...

  2. 数据结构-二叉树层次遍历

    首先介绍下二叉树的层次遍历即按照顺序对树节点依次访问,如下图: 顺序遍历的结果为:ABCDEFGHIJK 我们可以借助一个队列来实现二叉树的层次遍历:思路如下: 先将二叉树根节点入队,然后出队,访问该 ...

  3. 二叉树层次遍历--广度遍历和深度遍历

    问题来源:二叉树层次遍历 问题描述:给定一个二叉树,返回其按层次遍历的节点值. (即逐层地,从左到右访问所有节点). 例子: 给定二叉树: [3,9,20,null,null,15,7], 3/ \9 ...

  4. 由序列确定二叉树:前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 代码实现(c语言)

    下面三种序列可以唯一的构造唯一的一棵二叉树: 前序序列和中序序列构造二叉树 后序序列和中序序列构造二叉树 层次遍历序列和中序遍历序列构造二叉树 #include<stdio.h> #inc ...

  5. C语言程序设计第六章例题(数组)

    C语言程序设计第六章例题 例6.1 对十个元素依次赋值0,1,2,3,4,5,6,7,8,9,要求按逆序输出 例6.2 用数组来处理斐波那契数列 例6.3 有十个地区的面积,要求按从小到大输出 例6. ...

  6. 树(二叉树层次遍历输出及二叉树前序遍历输入)

    前两篇解释了二叉树的有关逻辑概念及前中后序输出递归代码的实现,这篇将讲述二叉树层次遍历输出如何实现以及二叉树前序遍历输入的两种情况. 定义结构体 struct BiNode{char data;BiN ...

  7. java程序设计基础_陈国君版第五版_第六章例题

    java程序设计基础_陈国君版第五版_第六章例题 class Cylinder {double radius;int height;double pi = 3.14;void area(){Syste ...

  8. 二叉树层次遍历:队列

    二叉树层次遍历 二叉树层次遍历的基本算法在本文中不提及.本文内容为,在二叉树层次遍历中,为何选用队列这样一种数据结构. 不使用额外数据结构 首先,假设我们不使用额外的数据结构,只使用 1 个指针: 访 ...

  9. (数据结构)二叉树层次遍历

    二叉树层次遍历 二叉树层次遍历的实现思想是:通过队列数据结构,从树的根结点开始,依次将其左孩子和右孩子入队:而后每次队列中一个结点出队,都将其左孩子和右孩子入队,直到树中所有结点都出队,出队结点的先后 ...

最新文章

  1. Android Studio找不到org.apache.http中的类
  2. 洛谷 P1343 地震逃生
  3. easyexcel 设置标题_EasyExcel,让 excel 导入导出更加简单
  4. word2vec介绍
  5. MySQL-04:数据内容操作-增删改查-基本命令笔记
  6. Java源文件声明规则
  7. 【LeetCode-SQL每日一练】—— 627. 变更性别
  8. 网络流sap需要注意的地方
  9. vue绑定自定义属性(属性值:false),DOM不显示问题
  10. 计算机辅助建筑制图规范,房屋建筑制图统一标准 [附条文说明] GB/T50001-2017
  11. au人声处理_如何使用AU软件为视频降噪?
  12. tensorflow: 重置/清空计算图
  13. Navicat怎样导入Excel表格数据
  14. 【直线检测】【matlab】基于Hough变换的直线检测
  15. Logo设计技巧和方法
  16. 牛客-1114E 老瞎眼 pk 小鲜肉(思维 + 离线 + 线段树 - 维护区间最小值)
  17. vue+环信客服前端对接
  18. RK100键盘说明书
  19. C语言圣诞树(精修版)附图(有初学者版还有进阶版)
  20. jQuery之浏览器打印插件

热门文章

  1. seo 伪原创_seo文章优化(怎么样做好伪原创文章)
  2. jsp action java_jsp中Action使用session方法实例分析
  3. C语言寻找第k小元素,小技巧——查找第k小的元素
  4. Python数据结构与算法(2.3)——链表
  5. Spring Boot @ SpringBootApplication,SpringApplication类
  6. 微软系统工具套装(Windows Sysinternals Suite)
  7. 开课吧:微服务与DDD解析
  8. Java基础笔记(一)
  9. Android知识点复习(一)-Android系统架构
  10. matlab的findpeak 极点查找