这道题首先被一句话影响了。
前序或者后序遍历,加上中序遍历可以确定一颗二叉树。这句话不假。
但是我想当然的认为一个树的前序和中序都是。另外一个树的前序和中序的子序列。
那就是子树。实际上随便画画就不对。比如{8,8,7,9,2,#,#,#,4,7}和{8,9,2}很明显就不对。
然后就写了一个暴力递归。
拿树A的每一个子树和树B做比较,如果每个节点都相等。则是子树。
这里注意一点的是。树B到达尾节点的时候。树A可能还有子节点。
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null){
return false;
}
if(isEqual(root1,root2)){
return true;
}else{
return (HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2));
}
}
public boolean isEqual(TreeNode root1,TreeNode root2){
if(root2 == null){
return true;
}
if(root1 == null || root1.val != root2.val){
return false;
}else{
return (isEqual(root1.left,root2.left) && isEqual(root1.right,root2.right));
}
}
}
感觉两个函数可以合成一个,就试了下,结果过不了。看答案,都是写了两个。求大神赐教一个函数能解决的答案。
不AC代码:
/**
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
if(root1 == null || root2 == null){
return false;
}
if(root1.val == root2.val && root2.left == null && root2.right == null){
return true;
}
if(root1.val == root2.val){
return (HasSubtree(root1.left,root2.left) && HasSubtree(root1.right,root2.right));
}else{
return (HasSubtree(root1.left,root2) || HasSubtree(root1.right,root2));
}
}
}