树的遍历【东北大学oj数据结构7-3】C++

ops/2024/12/16 0:44:59/
题面

二叉树是递归定义的。 二叉树 T 是定义在有限节点集上的结构
不包含节点,或者由三个不相交的节点集组成:

  • 一个根节点。
  • 称为左子树的二叉树。
  • 称为右子树的二叉树。
    您的任务是编写一个程序,该程序基于以下算法执行树遍历(系统地遍历树中的所有节点):

打印根、左子树和右子树(前序)。
打印左子树、根和右子树(中序)。
打印左子树、右子树和根(后序)。
这里,给定的二叉树由 n 个节点组成,每个节点都有一个从0到n-1的唯一ID。

输入

输入的第一行包括一个整数 n,即树的节点数。
在接下来的 n 行中,每个节点的信息以以下格式给出:
id left right
id 是节点的ID,left 是左孩子的ID,right 是右孩子的ID。 如果节点没有左(右)子节点,左(右)用-1表示

输出

在第一行,打印“Preorder”,在第二行,打印通过前序遍历获得的节点 ID 列表。
在第 3 行打印“Inorder”,在第 4 行打印通过中序遍历获得的节点 ID 列表。
在第 5 行打印“Postorder”,在第 6 行打印通过后序遍历获得的节点 ID 列表。

在每个节点 ID 之前打印一个空格字符。

Constraints
1 ≤ n ≤ 25

输入样例

9
0 1 4
1 2 3
2 -1 -1
3 -1 -1
4 5 8
5 6 7
6 -1 -1
7 -1 -1
8 -1 -1

输出样例

Preorder
 0 1 2 3 4 5 6 7 8
Inorder
 2 1 3 0 6 5 7 4 8
Postorder
 2 3 1 6 7 5 8 4 0 

递归实现
#include <iostream>using namespace std;#define MAX 30// 定义树的节点结构
struct Node {int p, l, r;
};struct Node T[MAX];  // 树节点数组
int n;  // 节点的数量void preorder(int root)
{if(root==-1) return;cout<<root<<" ";preorder(T[root].l);preorder(T[root].r);
}
void inorder(int root)
{if(root==-1) return;inorder(T[root].l);cout<<root<<" ";inorder(T[root].r);
}
void posorder(int root)
{if(root==-1) return;posorder(T[root].l);posorder(T[root].r);cout<<root<<" ";
}int main() {int i, v, l, r;scanf("%d", &n);for (i = 0; i < n; i++) {T[i].p = T[i].l = T[i].r = -1;}for (i = 0; i < n; i++) {scanf("%d %d %d", &v, &l,&r);if(l!=-1){T[v].l=l;T[l].p=v;}if(r!=-1){T[v].r=r;T[r].p=v;}}for (int i = 0; i < n; i++) {if(T[i].p==-1){r=i;break;}}cout<<"Preorder"<<endl;preorder(r);cout<<endl;cout<<"Inorder"<<endl;inorder(r);cout<<endl;cout<<"Postorder"<<endl;posorder(r);cout<<endl;return 0;
}
 非递归实现
#include <iostream>
#include <stack>
using namespace std;#define MAX 30// 定义树的节点结构
struct Node {int p, l, r;
};struct Node T[MAX];  // 树节点数组
int n;  // 节点的数量void preorder(int root)
{if(root==-1) return;stack<int> s;s.push(root);while(!s.empty()){int node=s.top();s.pop();cout<<node<<" ";if(T[node].r!=-1)s.push(T[node].r);if(T[node].l!=-1)s.push(T[node].l);}
}
void inorder(int root)
{if(root==-1) return;stack<int> s;int current=root;while(!s.empty()||current!=-1){while(current!=-1){s.push(current);current=T[current].l;}current=s.top();s.pop();cout<<current<<" ";current=T[current].r;}
}
void posorder(int root)
{if(root==-1) return;stack<int> s1,s2;s1.push(root);while(!s1.empty()){int node=s1.top();s1.pop();s2.push(node);if(T[node].l!=-1)s1.push(T[node].l);if(T[node].r!=-1)s1.push(T[node].r);}while(!s2.empty()){cout<<s2.top()<<" ";s2.pop();}
}int main() {int i, v, l, r;scanf("%d", &n);for (i = 0; i < n; i++) {T[i].p = T[i].l = T[i].r = -1;}for (i = 0; i < n; i++) {scanf("%d %d %d", &v, &l,&r);if(l!=-1){T[v].l=l;T[l].p=v;}if(r!=-1){T[v].r=r;T[r].p=v;}}for (int i = 0; i < n; i++) {if(T[i].p==-1){r=i;break;}}cout<<"Preorder"<<endl;preorder(r);cout<<endl;cout<<"Inorder"<<endl;inorder(r);cout<<endl;cout<<"Postorder"<<endl;posorder(r);cout<<endl;return 0;
}


http://www.ppmy.cn/ops/142248.html

相关文章

【jvm】GC Roots有哪些

目录 1. 说明2. 虚拟机栈&#xff08;栈帧中的局部变量表&#xff09;中的引用3. 方法区中的类静态属性引用4. 本地方法栈&#xff08;Native方法栈&#xff09;中JNI&#xff08;Java Native Interface&#xff09;的引用5. 活跃线程&#xff08;Active Threads&#xff09;6.…

网络编程02

1. 回显服务器——UDP 一个 UDP 的客户端/服务器通信的程序——回显服务器&#xff08;echo server&#xff09;&#xff1a; 这个程序只是单纯地调用 Socket API 1&#xff09;让客户端给服务器发送一个请求&#xff0c;请求就是从控制台输入的字符串 2&#xff09;服务器…

Layer Norm 提升训练稳定性的原理:解决权重初始值敏感性问题(中英双语)

Layer Norm 提升训练稳定性的原理与数值模拟 在深度学习模型中&#xff0c;权重初始值对训练过程的稳定性影响极大&#xff0c;尤其在深层网络和长序列任务中&#xff0c;初始值不当会导致梯度消失或爆炸的问题&#xff0c;进而导致训练不稳定。Layer Normalization (Layer No…

开源分布式系统追踪-00-overview

分布式跟踪系列 CAT cat monitor 分布式监控 CAT-是什么&#xff1f; cat monitor-02-分布式监控 CAT埋点 cat monitor-03-深度剖析开源分布式监控CAT cat monitor-04-cat 服务端部署实战 cat monitor-05-cat 客户端集成实战 cat monitor-06-cat 消息存储 skywalking …

基于小程序实现地图定位、轨迹绘制、地图标点、快捷导航、唤醒导航APP、开箱即用

目录 前言研究背景与意义研究目标与内容研究方法与技术路线小程序地图组件介绍定位技术与原理轨迹绘制技术地图标注与标记功能地图定位与轨迹绘制功能实现定位功能设计与实现获取用户当前位置总结说明代码块前言 研究背景与意义 地图定位和轨迹追踪作为智能手机中常见的功能之…

【JAVA】Java项目实战—Java EE项目:企业资源规划(ERP)系统

在企业管理中&#xff0c;企业资源规划&#xff08;ERP&#xff09;系统是不可或缺的工具。它能够帮助企业高效管理各种资源&#xff0c;包括人力资源、财务资源和库存等。Java作为一种成熟的编程语言&#xff0c;因其跨平台特性、强大的生态系统以及良好的社区支持&#xff0c…

git 推送远程仓库 master -> master (push declined due to repository rule violations)

问题概述 从报错信息中看出&#xff0c;提交中包含了秘密&#xff0c;提交被拒绝了&#xff0c;从提供的网址Working with push protection from the command line - GitHub Docs 中找到原因。原来是提交中包含了github的Personal access tokens被拒绝了。 解决方法 rebase …

GitHub 开源仓库推荐:poe2skills

poe2skills是一个专为《流放之路 2》玩家和开发者设计的开源项目。它收集了游戏中所有的技能和被动宝石信息&#xff0c;帮助玩家更好地理解和利用游戏中的各种机制。对于那些希望深入挖掘游戏潜力的玩家来说&#xff0c;这个仓库无疑是一个宝贵的资源。 功能亮点 全面的技能数…