题目一:根据二叉树前序,中序序列,编程输出该树的后序序列。
如给出:
前序:ABCDEF
中序:BCDEFA
上面给出的两个序列不一定是正确的,因此写出的程序还要求判断给出的序列是否是一棵正确的二叉树,如果不正确,返回“failed!”。题目二:握手问题。
李氏夫妇请其他四对夫妇吃饭,已知他们自己不能自己握手,不能后自己配偶握手,和其他人握手最多只能一次,最后,李某问其他人握手了几次,他们每个人的答案都不一样,问:李氏夫人握手了几次?
如给出:
前序:ABCDEF
中序:BCDEFA
上面给出的两个序列不一定是正确的,因此写出的程序还要求判断给出的序列是否是一棵正确的二叉树,如果不正确,返回“failed!”。题目二:握手问题。
李氏夫妇请其他四对夫妇吃饭,已知他们自己不能自己握手,不能后自己配偶握手,和其他人握手最多只能一次,最后,李某问其他人握手了几次,他们每个人的答案都不一样,问:李氏夫人握手了几次?
解决方案 »
- 小小合并算法.求解
- JMF 播放视频问题
- JSF 几乎崩溃 有人教我1000分都给
- java中为什么能在main方法中挑用静态方法 ???
- 求一个可以实现垂直或者方向分割3个组件的JSplitPane的实现
- 大家帮忙看看方法该怎样定义啊
- java有没有什么类可以构建HTTP头结构然后发送到目的地?
- 应该是与范型有关的问题
- JAVA下包编译的问题,我在 D:\sample 目录下 有几个JAVA文件要编译,其中一个需要调用另外一个CLASS。但是总是提示这些错误。。。。
- 网页里的java applet,我想让它旋转90度放置在网页中,行吗??(超急,在线等!)
- 握手问题
- 紧急求救,怎么在按下一个键的时候改变一个值 ,放开的时候又恢复原值?
import java.io.BufferedReader;
import java.io.InputStreamReader;public class TreeNode {
public static String res = "";
static int findchar(String s,char a){
for(int i=0;i<s.length();i++){
if(a==s.charAt(i))
return i;
}
return -1;
}
static boolean StringEquals(String a1,String a2){
boolean state= true;
if(a1.length()!=a2.length()){
state = false;
}
if(a1.length()==a2.length()){
for(int i=0;i<a1.length();i++){
if(findchar(a2,a1.charAt(i))==-1)
state = false;
}
}
return state;
}
static void cal_tree(String sa,String sb){
boolean state = StringEquals(sa,sb);
if(state==false)
return ;
if(sb.length()==0)
return ;
if(sb.length()==1){
//System.out.print(sb);
res+=sb;
return ;
}
char x = sa.charAt(0);
int mid = findchar(sb,x);
String c = sb.substring(0,mid);
String d = sb.substring(mid+1);
cal_tree(sa.substring(1,c.length()+1),c);
cal_tree(sa.substring(1+c.length()),d);
res+=String.valueOf(x);
//System.out.print(x);
return ;
}
public static void main(String[] agrs){
try {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
while(true){
System.out.println("前序:");
String s1 = br.readLine().trim();
System.out.println("中序:");
String s2 = br.readLine().trim();
System.out.println("后序:");
cal_tree(s1,s2);
if(res.length()!=s1.length())
System.out.println("NO ANSWER!");
else{
System.out.println(res);
res="";
}
System.out.println("继续或者结束:Y/N");
if(br.readLine().trim().equalsIgnoreCase("Y")){
continue;
}
else{
break;
}
}
//cal_tree("DBACEGF","ABCDEFG");
//cal_tree("ABCD","BDAC");
} catch (Exception e) {
// TODO Auto-generated catch block
System.out.println("NO ANSWER!");
}
}
}
public class SortTree
{
public static void main(String[] args)
{
char[] preSort = {'A', 'B', 'C', 'D', 'E', 'F'};
char[] midSort = {'B', 'C', 'D', 'E', 'F', 'A'};
TreeVo tree = constructTree(preSort, midSort);
printLatTree(tree);
}
public static TreeVo constructTree(char[] preSort, char[] midSort)
{
TreeVo tree = new TreeVo();
int index = find(preSort, midSort);
char[] lMidSort = new char[index];
char[] rMidSort = new char[midSort.length - index - 1];
System.arraycopy(midSort, 0, lMidSort, 0, lMidSort.length);
System.arraycopy(midSort, index + 1, rMidSort, 0, rMidSort.length);
tree.setRoot(midSort[index]);
if(index == 0)
{
tree.setLchild(null);
}
else
{
tree.setLchild(constructTree(preSort, lMidSort));
}
if(index == midSort.length - 1)
{
tree.setRchild(null);
}
else
{
tree.setRchild(constructTree(preSort, rMidSort));
}
return tree;
}
public static int find(char[] preSort, char[] midSort)
{
for(int i = 0; i < preSort.length; i++)
{
for(int j = 0; j < midSort.length; j++)
{
if(preSort[i] == midSort[j])
{
return j;
}
}
}
return -1;
}
public static void printLatTree(TreeVo tree)
{
if(tree == null)
{
return;
}
printLatTree(tree.getLchild());
printLatTree(tree.getRchild());
System.out.print(tree.getRoot());
}
}public class TreeVo
{
private char root;
private TreeVo lchild;
private TreeVo rchild; public TreeVo getLchild() {
return lchild;
} public void setLchild(TreeVo lchild) {
this.lchild = lchild;
} public TreeVo getRchild() {
return rchild;
} public void setRchild(TreeVo rchild) {
this.rchild = rchild;
} public char getRoot() {
return root;
} public void setRoot(char root) {
this.root = root;
}
}
public static TreeVo constructTree(char[] preSort, char[] midSort)
输入: preSort代表先序序列,midSort代表中序序列
输出: 根据输入参数构造好的二叉树(TreeVo包含3个成员变量: root树根节点的值,lChild左子树,rChild右子树)处理思想: 在midSort中定位在preSort中最先出现的节点,这就是当前树的根节点,然后把midSort拆分两部分,根节点前面的部分就是左子树,后面部分就是右子树.
按照这样的思想一直递归,得到原来的二叉树.