设计程序,按先序创建二叉树的二叉链表;然后先序、中序、后序遍历二叉树。
输入格式:
按先序输入一棵二叉树。二叉树中每个结点的键值用字符表示,字符之间不含空格。注意空树信息也要提供,以#字符表示空树。
输出格式:
输出3行。第一行是先序遍历二叉树的序列,第二行是中序遍历二叉树的序列,第三行是后序遍历二叉树的序列。每行首尾不得有多余空格。序列中不含#。
输入样例:
ab##dc###
输出样例:
abdc
bacd
bcda
感想:
最开始我是把输入的字符串放入数组中,来创建二叉树(这可能就是被定向思维限制了吧,毕竟java对待字符串绝大多数情况就是一口气输入的,再对串进行操作。)但我试过很多次发现这种解法在每次存入一个数据都要重新从头遍历二叉树,再找到下一个位置存储元素,由于输入的是字符而不是数字所以这个方法根本没办法找到对应位置,所以在多方碰壁无果后我在网上搜索了一下c++大佬的解题思路,虽然我不懂c++,但我还是有一点c语基础的,我发现他们都是在输入一个字符,存入一个数据(都是在创建二叉树方法里完成),这样就不必从新遍历找位置了,由于Java我只见过char a=s.charAt(0),这一种只输入一个字符的,但这个根本不符合要求,也是需要输入一串字符,再在这个字符里取第一个。所以我就试着在网上搜索了一下,结果不出所料果然有符合要求的,就是我下面创建的put函数,问题就迎刃而解了。
对于pta网上c++答案居多,而java资源相对较少,这对我们Java学者来说稍微有些小不便吧,这我也感同身受。就让我也来添砖加瓦吧,希望能对你有用。)
import java.io.IOException;
import java.util.*;
public class Main{
public static void main(String[] args) throws IOException {
solution s=new solution();
TreeNode head=null;
head=s.mytree(head);
s.qianxu(head);
System.out.println();
s.zhongxu(head);
System.out.println();
s.houxu(head);
System.out.println();
}
}
class solution
{
public static char put() throws IOException//由于可能会出错所以需要这个后缀
{//输入函数每次只输入一字符(核心1)
char a=(char)System.in.read();
return a;
}
public static TreeNode mytree(TreeNode head) throws IOException//创建二叉树(核心2)
{
char b=put();//输入一个字符
if(b=='#')
head=null;//若满足条件标记为空
else
{
head=new TreeNode(b);//存入数据
head.left=mytree(head.left);//递归遍历存入左右节点
head.right=mytree(head.right);
}
return head;
}
public static void qianxu(TreeNode root)//前序遍历
{
if(root==null)//退出条件
return ;
System.out.print(root.val);//先输出本结点
qianxu(root.left);//探索左节点
qianxu(root.right);//探索右节点
}
public static void zhongxu(TreeNode root)//中序遍历
{
if(root==null)//退出条件
return ;
zhongxu(root.left);//先探索左节点
System.out.print(root.val);//输出本节点
zhongxu(root.right);//探索右节点
}
public static void houxu(TreeNode root)//后序遍历
{
if(root==null)//退出条件
return ;
houxu(root.left);//先探索左节点
houxu(root.right);//后探索右节点
System.out.print(root.val);//输出本节点
}
}
class TreeNode {//二叉树储存
char val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(char val) { this.val = val; }
}