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;
        }
    }
    
  • 相关阅读:
    无限维
    黎曼流形
    why we need virtual key word
    TOJ 4119 Split Equally
    TOJ 4003 Next Permutation
    TOJ 4002 Palindrome Generator
    TOJ 2749 Absent Substrings
    TOJ 2641 Gene
    TOJ 2861 Octal Fractions
    TOJ 4394 Rebuild Road
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/13916563.html
Copyright © 2011-2022 走看看