题目1:给出左右子树,然后前序遍历
题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 n。(1≤n≤26)
后面 n 行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 *
表示
输出格式
二叉树的前序遍历。
输入输出样例
输入 #1复制
6 abc bdi cj* d** i** j**
输出 #1复制
abdicj
题解:这是一个简单的二叉树问题
设立一个结构体存储左右儿子,然后用递归遍历一下左右儿子就可以了,实现前序输出的排版。
代码如下
#include"cstdio"
#include"iostream"
using namespace std;
struct node{
char lr;
char rr;//左儿子,右儿子
}tree[300];
void pri(char s)//前序遍历
{
if(s=='*')
return ;
if(s!='*')
printf("%c",s);
pri(tree[s].lr);
pri(tree[s].rr);
}
int main()
{
int n,m;
char c,root;
scanf("%d",&n);
cin>>root;//确定根结点
cin>>tree[root].lr;
cin>>tree[root].rr;
for(m=2;m<=n;m++)
{
cin>>c;
cin>>tree[c].lr;
cin>>tree[c].rr;
}
pri(root);
return 0;
}
题目2:给出两个儿子,求二叉树深度
题目描述
给出每个节点的两个儿子节点,建立一棵二叉树(根节点为 1),如果是叶子节点,则输入0 0
。建好树后希望知道这棵二叉树的深度。二叉树的深度是指从根节点到叶子结点时,最多经过了几层。
最多有 10^6 个结点。
输入格式
无
输出格式
无
输入输出样例
输入 #1复制
7 2 7 3 6 4 5 0 0 0 0 0 0 0 0
输出 #1复制
4
题解:
1.设立一个结构体存储左右儿子,然后用递归遍历一下左右儿子就可以了,在题目1的基础上要加上度的叠加。
2.每走到儿子一次就深度就加一,再设置一个全局变量记录一下ans最大深度的值。
代码如下
#include"stdio.h"
int max=0;
int n;
struct node{
int l;
int r;
}x[1000009];
int ax(int a,int b)
{
if(a>b)
return a;
else
return b;
}
void dfs(int m,int step)
{
if(m==0)//该结点数为0,就意味着结点不存在
return;
max=ax(max,step);
dfs(x[m].l,step+1);
dfs(x[m].r,step+1);
}
int main()
{
int m;
scanf("%d",&n);
for(m=1;m<=n;m++)
scanf("%d%d",&x[m].l,&x[m].r);
dfs(1,1);
printf("%d",max);
return 0;
}