zoukankan      html  css  js  c++  java
  • [leetCode]572. 另一个树的子树

    题目

    链接:https://leetcode-cn.com/problems/subtree-of-another-tree

    给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和节点值的子树。s 的一个子树包括 s 的一个节点和这个节点的所有子孙。s 也可以看做它自身的一棵子树。

    示例 1:
    给定的树 s:
    
         3
        / 
       4   5
      / 
     1   2
    给定的树 t:
    
       4 
      / 
     1   2
    返回 true,因为 t 与 s 的一个子树拥有相同的结构和节点值。
    
    示例 2:
    给定的树 s:
    
         3
        / 
       4   5
      / 
     1   2
        /
       0
    给定的树 t:
    
       4
      / 
     1   2
    返回 false。
    

    递归

    思路先通过后序遍历遍历二叉树,将当前节点值与t树的头节点值进行比较如果相同则进行递归比较s的子树与t是否相同,如果相同返回true,如果不同则继续遍历二叉树

    class Solution {
        public boolean isSubtree(TreeNode s, TreeNode t) {
            if (s == null && t == null) {
                return true;
            }
            if (s == null && t != null) {
                return false;
            }
            boolean isSub = isSubtree(s.left, t) || isSubtree(s.right, t);
    
            if (s.val == t.val) {
                if (compare(s, t)) {
                    return true;
                }
            }
            return isSub;
        }
    
        private boolean compare(TreeNode p, TreeNode q) {
            if (p == null && q != null)
                return false;
            else if (p != null && q == null)
                return false;
            else if (p == null && q == null)
                return true;
            else if (p.val != q.val) return false;
    
            return compare(p.left, q.left) && compare(p.right, q.right); 
        }
    }
    

    迭代

    相同思路,改用迭代

    class Solution {
        public boolean isSubtree(TreeNode s, TreeNode t) {
            Queue<TreeNode> queue = new LinkedList<>();
            queue.offer(s);
            while (!queue.isEmpty()) {
                TreeNode cur = queue.poll();
                if (cur.val == t.val) {
                    if (compare(cur, t)) {
                        return true;
                    }
                }
                if (cur.left != null)
                    queue.offer(cur.left);
                if (cur.right != null)
                    queue.offer(cur.right);
            }
            return false;
        }
    
        private boolean compare(TreeNode p, TreeNode q) {
            Queue<TreeNode> queue1 = new LinkedList<>();
            queue1.offer(p);
            queue1.offer(q);
            while (!queue1.isEmpty()) {
                TreeNode l = queue1.poll();
                TreeNode r = queue1.poll();
                if (l == null && r != null)
                    return false;
                else if (r == null && l != null)
                    return false;
                else if (r == null && l == null)
                    continue;
                else if (r.val != l.val)
                    return false;
                queue1.offer(l.left);
                queue1.offer(r.left);
                queue1.offer(l.right);
                queue1.offer(r.right);
            }
            return true;
        }
    }
    
  • 相关阅读:
    《Spring Boot 实战》-- 读书笔记
    Dockerfile 编写规范整理
    SQL 学习教程整理
    Spring Boot Actuator 的基本用法
    Spring Data JPA 的基本用法
    在 Spring MVC 中使用 Validation API 进行字段校验
    Spring MVC 中 Model 的用法
    windows net sc
    MySQL提示“too many connections”的解决办法
    ab命令做简单压测
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13916563.html
Copyright © 2011-2022 走看看