A1102 Invert a Binary Tree (25分)(二叉树的中序遍历和层序遍历、静态二叉树的创建)
一、技术总结
- 这一题主要学习到的有,二叉树的创建,可以使用静态链表的方,也就是创建一个只有记录左右子树下标的结构体,然后创建N个结点的结构体数组;
- 同时对于这类题一般需要找出根结点,可以创建一个N个结点的数组,默认初始化为0,然后出现的结点下标都是左右子树,因此标记为1,然后从第一个结点开始遍历,第一个出现0的下标即为根结点下标;
- 还有就是中序遍历和层序遍历的熟悉,层序遍历中一个注意点就是,进入while循环后,会从队列的首部弹出一个结点,记住后序操作都是以此结点为准,不然会出错;
- 还有对于遍历输出技巧,可以遍历中使用一个vector向量接收遍历的顺序,最后在进行统一的输出;
二、参考代码
#include<iostream>
#include<string>
#include<queue>
#include<vector>
using namespace std;
struct node{
int id, l, r;
}a[100];
vector<int> vIn, vLe;
void levelOrder(int root){
queue<int> q;
q.push(root);
while(!q.empty()){
int top = q.front();
vLe.push_back(top);
q.pop();
if(a[top].l != -1) q.push(a[top].l);
if(a[top].r != -1) q.push(a[top].r);
}
}
void inOrder(int root){
if(root == -1){
return;
}
inOrder(a[root].l);
vIn.push_back(root);
inOrder(a[root].r);
}
int main(){
int n, root = 0, have[100] = {0};
cin >> n;
for(int i = 0; i < n; i++){
string l, r;
a[i].id = i;
cin >> l >> r;
if(l != "-"){
a[i].r = stoi(l);
have[stoi(l)] = 1;
}else{
a[i].r = -1;
}
if(r != "-"){
a[i].l = stoi(r);
have[stoi(r)] = 1;
}else{
a[i].l = -1;
}
}
while(have[root] == 1) root++;
levelOrder(root);
inOrder(root);
for(int i = 0; i < n; i++){
if(i != 0) printf(" ");
printf("%d", vLe[i]);
}
cout << endl;
for(int i = 0; i < n; i++){
if(i != 0) printf(" ");
printf("%d", vIn[i]);
}
return 0;
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:
“华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.