zoukankan      html  css  js  c++  java
  • 剑指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;
    
        }
    
    }
    

      

  • 相关阅读:
    vue-cli脚手架工具构建&初始化vue项目
    2020/05/17 Github加速-DNS配置
    同时将本地git仓库提交到gitee和github
    git远程仓库在本地看不到&push 到远程仓库失败的解决方案
    stylus的使用-变量和函数
    webpack使用4-HRM热替换&SourceMap&解析es语法
    webpack使用3-plugin插件的使用
    webpack使用2-常用的几个loader的使用
    webpack基本使用
    spring框架里面的注入?
  • 原文地址:https://www.cnblogs.com/BaoZiY/p/11176101.html
Copyright © 2011-2022 走看看