洛谷新二叉树
题目描述
输入一串二叉树,输出其前序遍历。
输入格式
第一行为二叉树的节点数 nn。(1 \leq n \leq 261≤n≤26)
后面 nn 行,每一个字母为节点,后两个字母分别为其左右儿子。
空节点用 *
表示
输出格式
二叉树的前序遍历。
输入输出样例
输入 #1复制
6
abc
bdi
cj*
d**
i**
j**
输出 #1复制
abdicj
说实话这道题对于新手的我来说还是挺好的,用到递归,附加一些树的前序遍历的知识。
前序的遍历的特点就是,根左右。
程序执行就是不断输出根节点,不断递归左子树,递归结束之后,再递归右子树,这里的右子树也是我一直想明白的,一般递归左子树结束之后,递归的是最左子树的右子树,而不是根节点的右子树。
这道题的思想:
输出根节点,判断是不是空,不是空,则递归左子树,因为每一行第二个和第三个数字分别代表的是左子树、右子树。所以最外层由
i从1开始,也就2次。最内层,就是最开始左子树作为哪一棵树的根节点,遍历下面的树,发现子树根节点和父树左子树相等,进行递归
,然后不断递归就可以了。
第一次内循环是左子树
第二次内循环是右子树。
package com.wu.Digui;
import java.util.Scanner;
public class 新二叉树 {
static String jieguo="";
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt();
String[] str = new String[n];
for (int i=0;i<n;i++){
str[i]=sc.next();
}
dfs(0, str);
System.out.println(jieguo);
}
private static void dfs(int k, String[] str) {
if (str[k].charAt(0)!='*'){
jieguo=jieguo+str[k].charAt(0);
for (int i=1;i<3;i++){ //先递归左边子树 ,再递归右子树
for (int j=1;j<str.length;j++ ){
if (str[k].charAt(i)==str[j].charAt(0)){
dfs(j,str);
}
}
}
}
}
}