1. 描述
给定彼此独立的两棵二叉树,树上的节点值两两不同,判断T1树是否有T2树完全相同的子树 子树指一棵树的某个节点的全部后继节点 示例 输入 {1,2,3,4,5,6,7,#,8,9} ,{2,4,5,#,8,9} 输出 true
1. 思路
自己思考的同时也参考过网上的一些题解,但还是不想把逻辑过程弄得抽象(这么做的话,意图像是在“找规律”),这不是我想要的,我还是更倾向于将程序的语义表达更加清晰。
简要的描述一下我的做法:我这里重点关注的是将数组形式的完美二叉树构建成树的数据结构->逻辑主要都集中在构建树的过程中了,子树的查询反而会变得更加简单扼要。
2. 我的题解
测试结果可以将根对象采用json形式输出出来,效果很明显
2.1 构建树
public class CompleteBinaryTree {
Node root;
Node[] nodes;
public CompleteBinaryTree(String[] seq){
this.build(seq);
}
void build(String[] seq){
this.nodes = new Node[seq.length];
this.root = this.nodes[0] = new Node(seq[0]);
for(int i=1;i<seq.length;i++){
this.nodes[i] = new Node(seq[i]);
}
Node node,pNode;
for(int i =1;i<seq.length;i++){
node = this.nodes[i];
pNode = this.nodes[(i-1)/2];
pNode.child(node);
}
}
}
2.2 是否存在子树?
上面完事了,那这一块可以说没有烦恼了
import java.util.Scanner;
public class Main {
static String[] p,c;
static void init(){
Scanner scanner = new Scanner(System.in);
String s = scanner.nextLine();
int idx_bgn_1 = s.indexOf("{")+1;
int idx_end_1 = s.indexOf("}");
int idx_bgn_2 = s.lastIndexOf("{")+1;
int idx_end_2 = s.lastIndexOf("}");
p = s.substring(idx_bgn_1,idx_end_1).split("[,]");
c = s.substring(idx_bgn_2,idx_end_2).split("[,]");
scanner.close();
}
static boolean isSub(Node pNode,Node cNode){
if(cNode == null){
return true;
}
else if(!pNode.value.equals(cNode.value)){
return false;
}else{
return isSub(pNode.left,cNode.left) && isSub(pNode.right,cNode.right);
}
}
public static void main(String[] args) {
init();
String cRootValue = c[0];
for(int i=0;i<p.length;i++){
if(!cRootValue.equals(p[i])){
continue;
}
Node pNode = new CompleteBinaryTree(p).nodes[i];
Node cNode = new CompleteBinaryTree(c).root;
System.out.println(isSub(pNode,cNode));
break;
}
}
}
|