有关字符串处理的系列问题。
拓扑结构相同子树判断问题。
题目:给定彼此独立的两颗树头节点分别为t1和t2,判断t1中是否有与t2树拓扑结构完全相同的子树。
注意这道题目还有一道变形,题目为“输入两颗二叉树A,B,判断B是不是A的子结构”。这两道题目很像,区别仅仅在于子结构与完全拓扑子树。举个例子
此为树A:
1
2 3
4 5 6 7
此为树B:
1
2 3
此为树C:
2
4 5
此时树B为树A的子结构,而树C为树A的子树。
所以先来看子树问题的解法。
通常的想法是依次遍历两棵树,当树A的某节点与树C的头节点相等时,开始同时遍历这两棵树,当C其剩余子节点与A对应子节点都相等时,认为C为A的子树。如果出现任何一处不相等,那么就继续遍历树A,继续找。这种方法容易理解,但时间复杂度相对较高,比较麻烦。
对于二叉树来说,二叉树的遍历是最基础的必修课。所以可以利用二叉树遍历,无论是先序、中序还是后序,遍历的结果都将是唯一的,可以将遍历后的结果存成字符串或数组,只需要判断树A遍历的结果中是否包含树C遍历的结果,就可以得出是否为子树的结论。
下面为代码实现:
public class TreeNode{
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val){
this.val = val;
}
}
public class IdenticalTree{
public boolean chkIdentical(TreeNode A,TreeNode B){
if(B == null || A == null){
return false;
}
String root1 = preOrder(A);
String root2 = preOrder(B);
return root1.contains(root2);
}
public String preOrder(TreeNode head){
//这里很关键,如果节点下为空,一定是要有符号代替空,否则会出现误判,因为空也是很重要的
if(head == null){
return " ";
}
String str = head.val + "";
str += preOrder(head.left);
str += preOrder(head.right);
return str;
}
}