您的位置:首页 > 其它

leetcode[Subtree of Another Tree]//待整理多种解法

2017-08-18 14:18 573 查看
解法一:

/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
//判断在二叉树s中是否存在一棵子树,使得该子树与二叉树t存在相同的结构,并且每个结点的值相同
//既然要每个结点的值相同,那么就在二叉树s中找出所有二叉树t的根节点的值相同的结点,然后再判断具体的结构是否相同
private void recurseFind(TreeNode root, List<TreeNode> list, int find){
if(root == null) return;
if(root.val == find){
list.add(root);
}
recurseFind(root.left, list, find);
recurseFind(root.right, list, find);
}

private void recurse(TreeNode root, List<TreeNode> list){
if(root == null) return;
list.add(root);
recurse(root.left, list);
recurse(root.right, list);
}

private boolean isSame(TreeNode a, TreeNode b){
//判断两棵二叉树是否相同,就将两棵树采用相同的遍历方式,然后遍历结点分别存入容器,最后来比较两个容器
List<TreeNode> listA = new ArrayList<>();
List<TreeNode> listB = new ArrayList<>();
recurse(a, listA);
recurse(b, listB);
if(listA.size() != listB.size()) return false;
while(!listA.isEmpty()){
if(listA.remove(0).val != listB.remove(0).val){
return false;
}
}

return true;
}

public boolean isSubtree(TreeNode s, TreeNode t) {
if(t == null) return true;
if(s == null && t != null) return false;
List<TreeNode> list = new ArrayList<>();//用一个容器来存放二叉树s中所有与二叉树t的根节点的值相同的结点
recurseFind(s, list, t.val);
boolean flag = false;
while(!flag && !list.isEmpty()){
//每次从List中移除一个检点,判断以这个结点为根的树是否与二叉树t具有相同的结构(并且每个结点的值相同)
TreeNode out = list.remove(0);
flag = isSame(out, t);
}

return flag;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: