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);
        }
  • 相关阅读:
    如何理解Linux中的load averages?
    如何准备Java初级和高级的技术面试
    大数据java基础吗?
    如何写出没有BUG的代码
    求强连通分量Tarjan算法
    图论_连通_连通分量
    欧拉函数
    二分图,匈牙利算法
    网络流24题(更新中
    一些简单二分题,简单的hash,H(i),字符串题
  • 原文地址:https://www.cnblogs.com/zywu/p/5772619.html
Copyright © 2011-2022 走看看