输入结点的前序序列,构造一棵二叉树 构建一棵如下图所示的二叉树: 1 / \ 2 3 / \ 4 5 用#代表空结点,则其前序序列为:1 2 4 # # 5 # # 3 # #。如何用终端读取用户输入的前序序列,构建出二叉树? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.util.*;//树的结点类型class BTNode{ private int elem=0; private BTNode lChild=null,rChild=null; BTNode(int elem){ this.elem=elem; } public void setLChild(BTNode lChild){ this.lChild=lChild; } public void setRChild(BTNode rChild){ this.rChild=rChild; } public BTNode getRChild(){ return rChild; } public BTNode getLChild(){ return lChild; } public int getElem(){ return elem; } public void setElem(int elem){ this.elem=elem; }}//二叉树类型public class BinaryTree{ public BTNode root=null; BinaryTree(Scanner input){ System.out.println("开始创建二叉树,请按树的前序序列输入各个结点,每输入一个结点后请回车:"); System.out.println("输入的前序序列:把二叉树的所有为空的结点用#代替,再按前序遍历得到的序列"); root=create(input); } public BTNode create(Scanner input){ String elemString=input.nextLine(); if(elemString.equals("#")){ return null; }else{ BTNode root=new BTNode(Integer.parseInt(elemString)); root.setLChild(create(input)); root.setRChild(create(input)); return root; } } public String preorder(BTNode root){ if(root==null){ return ""; }else{ String lstr=preorder(root.getLChild()); String rstr=preorder(root.getRChild()); String estr=String.valueOf(root.getElem()); if(lstr.length()>0){ if(rstr.length()>0){ return estr+" "+lstr+" "+rstr; }else{ return estr+" "+lstr; } }else{ if(rstr.length()>0){ return estr+" "+rstr; }else{ return estr; } } } } public String inorder(BTNode root){ if(root==null){ return ""; }else{ String lstr=inorder(root.getLChild()); String rstr=inorder(root.getRChild()); String estr=String.valueOf(root.getElem()); if(lstr.length()>0){ if(rstr.length()>0){ return lstr+" "+estr+" "+rstr; }else{ return lstr+" "+estr; } }else{ if(rstr.length()>0){ return estr+" "+rstr; }else{ return estr; } } } } public String postorder(BTNode root){ if(root==null){ return ""; }else{ String lstr=postorder(root.getLChild()); String rstr=postorder(root.getRChild()); String estr=String.valueOf(root.getElem()); if(lstr.length()>0){ if(rstr.length()>0){ return lstr+" "+rstr+" "+estr; }else{ return estr+" "+lstr; } }else{ if(rstr.length()>0){ return rstr+" "+estr; }else{ return estr; } } } } public static void main(String[] args){ BinaryTree tree=new BinaryTree(new Scanner(System.in)); System.out.println("前序序列:"); System.out.println(tree.preorder(tree.root)); System.out.println("中序序列:"); System.out.println(tree.inorder(tree.root)); System.out.println("后序序列:"); System.out.println(tree.postorder(tree.root)); }}结果:F:\java>java BinaryTree开始创建二叉树,请按树的前序序列输入各个结点,每输入一个结点后请回车:输入的前序序列:把二叉树的所有为空的结点用#代替,再按前序遍历得到的序列124##5##3##前序序列:1 2 4 5 3中序序列:4 2 5 1 3后序序列:4 5 2 3 1 java socket 如何自动获取客户端IP 请大家帮我分析一段代码,AffineTransform 相关 求助,JAVA下数据结构的汉诺塔小程序,已有基本代码! 请问那里有很详细的关于JDBC+swing的例子与教程呢? 独立线程,独立存放区域和独立的socket进行通信,却发现当A线程运行,影响B线程,为什么? 基础问题 请看代码 package中protect的问题.请指教! 各位老大,jndi需要的类怎么在我的jdk1.4.0里面找不到呢? 关于jdbc连接不上的问题 如何知道JTree多选结果 关于java System类。。。急 如何將百分比轉化為小數?
//树的结点类型
class BTNode{
private int elem=0;
private BTNode lChild=null,rChild=null;
BTNode(int elem){
this.elem=elem;
}
public void setLChild(BTNode lChild){
this.lChild=lChild;
}
public void setRChild(BTNode rChild){
this.rChild=rChild;
}
public BTNode getRChild(){
return rChild;
}
public BTNode getLChild(){
return lChild;
}
public int getElem(){
return elem;
}
public void setElem(int elem){
this.elem=elem;
}
}
//二叉树类型
public class BinaryTree{
public BTNode root=null;
BinaryTree(Scanner input){
System.out.println("开始创建二叉树,请按树的前序序列输入各个结点,每输入一个结点后请回车:");
System.out.println("输入的前序序列:把二叉树的所有为空的结点用#代替,再按前序遍历得到的序列");
root=create(input);
}
public BTNode create(Scanner input){
String elemString=input.nextLine();
if(elemString.equals("#")){
return null;
}else{
BTNode root=new BTNode(Integer.parseInt(elemString));
root.setLChild(create(input));
root.setRChild(create(input));
return root;
}
}
public String preorder(BTNode root){
if(root==null){
return "";
}else{
String lstr=preorder(root.getLChild());
String rstr=preorder(root.getRChild());
String estr=String.valueOf(root.getElem());
if(lstr.length()>0){
if(rstr.length()>0){
return estr+" "+lstr+" "+rstr;
}else{
return estr+" "+lstr;
}
}else{
if(rstr.length()>0){
return estr+" "+rstr;
}else{
return estr;
}
}
}
}
public String inorder(BTNode root){
if(root==null){
return "";
}else{
String lstr=inorder(root.getLChild());
String rstr=inorder(root.getRChild());
String estr=String.valueOf(root.getElem());
if(lstr.length()>0){
if(rstr.length()>0){
return lstr+" "+estr+" "+rstr;
}else{
return lstr+" "+estr;
}
}else{
if(rstr.length()>0){
return estr+" "+rstr;
}else{
return estr;
}
}
}
}
public String postorder(BTNode root){
if(root==null){
return "";
}else{
String lstr=postorder(root.getLChild());
String rstr=postorder(root.getRChild());
String estr=String.valueOf(root.getElem());
if(lstr.length()>0){
if(rstr.length()>0){
return lstr+" "+rstr+" "+estr;
}else{
return estr+" "+lstr;
}
}else{
if(rstr.length()>0){
return rstr+" "+estr;
}else{
return estr;
}
}
}
}
public static void main(String[] args){
BinaryTree tree=new BinaryTree(new Scanner(System.in));
System.out.println("前序序列:");
System.out.println(tree.preorder(tree.root));
System.out.println("中序序列:");
System.out.println(tree.inorder(tree.root));
System.out.println("后序序列:");
System.out.println(tree.postorder(tree.root));
}}
结果:
F:\java>java BinaryTree
开始创建二叉树,请按树的前序序列输入各个结点,每输入一个结点后请回车:
输入的前序序列:把二叉树的所有为空的结点用#代替,再按前序遍历得到的序列
1
2
4
#
#
5
#
#
3
#
#
前序序列:
1 2 4 5 3
中序序列:
4 2 5 1 3
后序序列:
4 5 2 3 1