• 剑指Offer——树的子结构


    1、题目描述

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

    2、代码实现

    package com.baozi.offer;
    
    /**
     * 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
     *
     * @author BaoZi
     * @create 2019-07-12-14:11
     */
    public class Offer14 {
        public boolean HasSubtree(TreeNode root1, TreeNode root2) {
            //判断树B是否是树A的子结构,那么树A和树B分别有两种情况
            //1、A ==null&&B==null;
            // 2、A ==null&&B!=null;
            // 3、A !=null&&B!=null;
            //4、A !=null&&B==null;
            //经过这种情况判断之后只能是两个树A和B都是非空的树才能执行下边的判断
            if (root2 == null) {
                return false;
            }
            if (root1 == null && root2 != null) {
                return false;
            }
            //定义一个boolean变量用于判断当前B的子树是否是A的子树结构
            boolean flag = false;
            //比较树B是否是树A 的子结构,我们的思路就是先找到树B的根节点在树A中的位置,当找到之后在逐一的比较
            //两个子树的各个节点时候是一样的
            if (root1.val == root2.val) {
                flag = isSubtree(root1, root2);
            }
            //如果当前节点不是要找的节点,那么就通过递归的方式查找树A的左子树中是否存在树B的根节点值
            if (!flag) {
                flag = HasSubtree(root1.left, root2);
                //如果左子树中不存在树B的根节点值,那么就通过递归的方式查找树A的右子树中是否存在树B的根节点值
                if (!flag) {
                    flag = HasSubtree(root1.right, root2);
                }
            }
            return flag;
    
        }
    
        //这个方法开始执行的时候就是root1和root2这两个子树的根节点是已经相等了
        private boolean isSubtree(TreeNode root1, TreeNode root2) {
            //接下来就是通过递归的方式来判断当前两个子树对应的各个节点是否是相等的
            //当递归到某一次的时候,此时的root2中的节点为空,说明针对root2 的比较已经结束了,当然要
            //返回true
            if (root2 == null) {
                return true;
            }
            //每次递归的遍历比较只能是两个待比较子树都要非空才能进行
            if (root1 == null && root2 != null) {
                return false;
            }
            if (root1.val == root2.val) {
                return isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right);
            } else {
                return false;
            }
        }
    
    }
    
    class TreeNode {
        int val = 0;
        TreeNode left = null;
        TreeNode right = null;
    
        public TreeNode(int val) {
            this.val = val;
    
        }
    
    }
    

      

  • 相关阅读:
    ov5640调试过程
    关于OnPaint函数的工作原理(很详细,很实用) [转载]
    机器视觉网络资源
    (转)signaltap II数据用于仿真
    DataSocket简介
    datasocket使用网络传输图像
    共享变量/全局变量/datasocket
    [转载] 任意频率分频原理
    [转]影响FPGA设计中时钟因素的探讨
    生产者和消费者
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/11176101.html
Copyright © 2020-2023  润新知