剑指offer 17. 代码的鲁棒性 树的子结构

题目描述

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

解题思路:先比较数A的根结点是否等于B的根结点,

如果不同,则比较A的左结点是否跟B的根结点相同

       如果不同·,则比较A的右结点是否跟B的根结点相同

一直这样比下去,直达遍历完整两棵树,看是否A包含B

具体代码实现如下:



public class HasSubtree {
public boolean HasSubtree(TreeNode root1,TreeNode root2) {
boolean result = false;
if (root1!=null&&root2!=null) {
if (root1.val==root2.val) {
result = ifTree1hasTree2(root1, root2);
}
if (!result) {
result = HasSubtree(root1.left,root2);
}
if (!result) {
result = HasSubtree(root1.right,root2);
}
}

return result;
}

public boolean ifTree1hasTree2(TreeNode root1,TreeNode root2) {
boolean flag=false;

if (root2==null) {
return true;
}
if (root1==null) {
return false;

}
if (root1.val!=root2.val) {
return false;
}

return ifTree1hasTree2(root1.left, root2.left)&&ifTree1hasTree2(root1.right, root2.right);

}
class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;

public TreeNode(int val) {
this.val = val;

}

}
}



代码具体解释如下:



public class Solution {

    public static boolean HasSubtree(TreeNode root1, TreeNode root2) {

        boolean result = false;

        //当Tree1和Tree2都不为零的时候,才进行比较。否则直接返回false

        if (root2 != null && root1 != null) {

            //如果找到了对应Tree2的根节点的点

            if(root1.val == root2.val){

                //以这个根节点为为起点判断是否包含Tree2

                result = doesTree1HaveTree2(root1,root2);

            }

            //如果找不到,那么就再去root的左儿子当作起点,去判断时候包含Tree2

            if (!result) {

                result = HasSubtree(root1.left,root2);

            }

            

            //如果还找不到,那么就再去root的右儿子当作起点,去判断时候包含Tree2

            if (!result) {

                result = HasSubtree(root1.right,root2);

               }

            }

            //返回结果

        return result;

    }

    public static boolean doesTree1HaveTree2(TreeNode node1, TreeNode node2) {

        //如果Tree2已经遍历完了都能对应的上,返回true

        if (node2 == null) {

            return true;

        }

        //如果Tree2还没有遍历完,Tree1却遍历完了。返回false

        if (node1 == null) {

            return false;

        }

        //如果其中有一个点没有对应上,返回false

        if (node1.val != node2.val) {  

                return false;

        }

        

        //如果根节点对应的上,那么就分别去子节点里面匹配

        return doesTree1HaveTree2(node1.left,node2.left) && doesTree1HaveTree2(node1.right,node2.right);

    }

来源:牛客网


原文地址:https://www.cnblogs.com/Transkai/p/10886470.html

时间: 2024-08-29 14:44:35

剑指offer 17. 代码的鲁棒性 树的子结构的相关文章

剑指offer(四十六)之树的子结构

题目描述 输入两颗二叉树A,B,判断B是不是A的子结构. 思路: 1.首先设置标志位result = false,因为一旦匹配成功result就设为true,剩下的代码不会执行,如果匹配不成功,默认返回false 2.递归思想,如果根节点相同则递归调用isSubTree(),如果根节点不相同,则判断tree1的左子树和tree2是否相同,再判断右子树和tree2是否相同 3.注意null的条件,HasSubTree中,如果两棵树都不为空才进行判断,isSubTree中,如果Tree2为空,则说明

《剑指offer》面试题18 树的子结构 Java版

(输入两棵二叉树A和B,判断B是不是A的子结构.补充下,根据书中的代码来看,子结构的定义并不包括叶子节点下的null,也就是说只要B的存在数字的结构存在于A中就行,那么如果B是null树,那么就不属于A的子结构) 书中方法:书上的方法十分清晰,分为两个步骤,先在A树中找到B树的root.val,然后判断由该点向下是否完全包含B树的结构,直至遍历完A树. public boolean isChild(TreeNode aRoot, TreeNode bRoot){ //A树没有遍历完而且B树不为空

【Java】 剑指offer(17) 在O(1)时间删除链表结点

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 给定单向链表的头指针和一个结点指针,定义一个函数在O(1)时间删除该结点. 思路 通常那样从头开始查找删除需要的时间为O(n),要在O(1)时间删除某结点,可以这样实现:设待删除结点i的下一个结点为j,把j的值复制到i,再把i的指针指向j的下一个结点,最后删除j,效果就相当于删除j. 注意特殊情况:1.当待删除结点i为尾结点时,无下一个结点,则只能从头到尾顺序遍历:2.当链

剑指OFFER(百度笔试)——二叉树的子结构

百度软件开发实习生笔试: 1.模拟短作业优先调度算法,计算平均等待时间,例如输入[0,2,4,8]表示四个作业分别是第0s到.第2s到.第4s到.第8s到.[2,1,6,3]表示四个作业的运行时间. 计算平均等待时间.每个作业的等待时间:实际开始时间-到达时间.(不可剥夺) 2.二叉树的子结构,输入两棵树A.B,判断B是不是A的子树.剑指offer也有,拿出来一起做了. /* struct TreeNode { int val; struct TreeNode *left; struct Tre

剑指Offer 17. 树的子结构 (二叉树)

题目描述 输入两棵二叉树A,B,判断B是不是A的子结构.(ps:我们约定空树不是任意一个树的子结构) 题目地址 https://www.nowcoder.com/practice/6e196c44c7004d15b1610b9afca8bd88?tpId=13&tqId=11170&rp=3&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 思路 如果树1或树2为空时,返回False 在树

[剑指Offer] 17.树的子结构

[思路]要查找树A中是否存在和树B结构一样的子树,可以分成两步: 1.第一步在树A中找到和B的根节点的值一样的结点R:即当前树A包含子树B,HasSubtree(...) 2.第二步再判断树A中以R为根结点的子树是不是包含和树B一样的结构.即当前树A是否是子树B,IsSubtree(...) 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x

剑指offer(17)层次遍历树

题目: 从上往下打印出二叉树的每个节点,同层节点从左至右打印. public class Solution { ArrayList<Integer> list = new ArrayList<Integer>(); public ArrayList<Integer> PrintFromTopToBottom(TreeNode root) { if(root==null) return list; TreeNode node = root; Queue<TreeNo

剑指offer 17:合并两个有序链表

题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. 解题思路 链表基础操作考察,难点在于对于输入数据的把握,一定要考虑输入数据的全面性 1.出现单链表为NULL: 2.两个链表都为NULL: 3.一个链表遍历完成,另一链表还有剩余的节点 4.两个链表等长: 下面给出具体C++代码实现: /* struct ListNode { int val; struct ListNode *next; ListNode(int x) : val(x), n

剑指offer之【复杂链表的复制】

题目: 复杂链表的复制 链接: https://www.nowcoder.com/practice/f836b2c43afc4b35ad6adc41ec941dba?tpId=13&tqId=11178&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为