剑指offer:树的子结构

来源:互联网 发布:非诚勿扰杨宇航淘宝店 编辑:程序博客网 时间:2024/06/02 02:07

题目描述

输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)

方法1:递归

【运行时间:16ms  占用内存:8140k】
public class Solution {    public boolean isSubtree(TreeNode root1,TreeNode root2){        if(root2==null) return true;        if(root1==null) return false;        if(root1.val==root2.val){            return isSubtree(root1.left,root2.left)&&isSubtree(root1.right,root2.right);        }else return false;    }        public boolean HasSubtree(TreeNode root1,TreeNode root2) {        if(root1==null||root2==null) return false;        return isSubtree(root1,root2)||HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);    }}

递归版本2:来自牛客网牛油回答,这个递归更好理解点。

public class Solution {    public boolean HasSubtree(TreeNode root1,TreeNode root2) {        if(root1==null||root2==null)return false;        return isSubtree(root1,root2)||HasSubtree(root1.left,root2)||HasSubtree(root1.right,root2);    }        public boolean isSubtree(TreeNode root1,TreeNode root2){        if(root2==null)return true;        if(root1==null)return false;        return (root1.val==root2.val)&&isSubtree(root1.left,root2.left)&&isSubtree(root1.right,root2.right);    }}

方法2:用两个ArrayList判断

思路:用将root1中节点数值放入list1中,节点2中数值放入list2中,依次遍历list2中数值,如果发现list2中数值list1中没有。则返回false,否则返回true.

【运行时间:15ms  占用内存:8544k】

import java.util.*;public class Solution {    ArrayList<Integer> list1 = new ArrayList<Integer>();ArrayList<Integer> list2 = new ArrayList<Integer>();    public boolean HasSubtree(TreeNode root1,TreeNode root2) {        if(root1==null||root2==null)return false;        getTree(root1,list1);        getTree(root2,list2);        for(int i:list2){            if(!list1.contains(i))                return false;        }        return true;    }        public void getTree(TreeNode root,ArrayList<Integer> list){        if(root==null)return;        getTree(root.left,list);        list.add(root.val);        getTree(root.right,list);    }}


原创粉丝点击