zoukankan      html  css  js  c++  java
  • 剑指offer-树的子结构

    题目描述

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

    /**
         * 基本思路:1.判断树A和树B是否有相同的根结点 2.如果存在,判断A的子树是否和B树结构相同 3.如果不存在,A树向下遍历,重复步骤1,2
         * 注意null的条件,hasSubTree中,如果两棵树都不为空才进行判断,
         * doesTree1HasTree2中,如果B树为空,则说明B树遍历完了,即匹配成功,
         * A树为空有两种情况(1)如果A树为空&&B树不为空说明不匹配,
         *                 (2)如果A树为空,B树为空,说明匹配。
         * @param root1 A树
         * @param root2 B树
         * @return
         */
        public boolean hasSubTree(BinaryTreeNode root1, BinaryTreeNode root2) {
    
            boolean result = false;
            if (root1 != null && root2 != null) {
                // 根节点相等,递归判断A中的以某个节点为根节点的子树是不是和树B具有相同的结构
                if (root1.value == root2.value) {
                    result = doesTree1HasTree2(root1, root2);
                }
                // 未匹配成功,A树向左子树递归查找与B树根节点相等的根结点
                if (!result) {
                    result = hasSubTree(root1.left, root2);
                }
                // 未匹配成功,A树向右子树递归查找与B树根节点相等的根结点
                if (!result) {
                    result = hasSubTree(root1.right, root2);
                }
    
            }
            return result;
    
        }
    
        private boolean doesTree1HasTree2(BinaryTreeNode root1, BinaryTreeNode root2) {
    
            // 递归到root2为空,说明B树是A树的子树
            if (root2 == null)
                return true;
            
            if (root1 == null) {
                return false;
            }
            // 结点值不相同,肯定不是子树
            if (root1.value != root2.value) {
                return false;
            }
    
            return doesTree1HasTree2(root1.left, root2.left)
                    && doesTree1HasTree2(root1.right, root2.right);
        }
  • 相关阅读:
    02-30 线性可分支持向量机
    02-28 scikit-learn库之线朴素贝叶斯
    02-27 朴素贝叶斯
    02-26 决策树(鸢尾花分类)
    047 选项模式
    第二节:师傅延伸的一些方法(复习_总结)
    第一节:登录流程
    第一节:对应拼音编码查询(后续更新)
    前端对象
    Form表单
  • 原文地址:https://www.cnblogs.com/zywu/p/5772619.html
Copyright © 2011-2022 走看看