100. 相同的树

本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

原文链接:blog.ouyangsihai.cn >> 100. 相同的树

本题来自 LeetCode:100. 相同的树[1]

题目描述

给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例  1:


输入:       1         1
          /        / 
         2   3     2   3

        [1,2,3],   [1,2,3]
输出: true

示例 2:


输入:      1          1
          /           
         2             2

        [1,2],     [1,null,2]

输出: false

示例  3:


输入:       1         1
          /        / 
         2   1     1   2

        [1,2,1],   [1,1,2]

输出: false

题目分析

  • 按照相同的路径遍历两棵树,比较相同路径上的每个节点是否相同。
  • 若相同,分别遍历左右子树;
  • 若不同,直接返回;
  • 可以采用二叉树的`前序遍历`;
  • 题目解答

    
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isSameTree(TreeNode p, TreeNode q) {
            if(p == null && q == null) {
                return true;
            }
            if(p == null || q == null) {
                return false;
            }
            if(p.val != q.val) {
                return false;
            }
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        }
    }
    

    复杂度分析:
    时间复杂度: O(n)
    空间复杂度: O(n)

    也可以采用 层次遍历法

    
    /**
     * Definition for a binary tree node.
     * public class TreeNode {
     *     int val;
     *     TreeNode left;
     *     TreeNode right;
     *     TreeNode(int x) { val = x; }
     * }
     */
    class Solution {
        public boolean isSameTree(TreeNode p, TreeNode q) {
            if(p == null && q == null) {
                return true;
            }
            ListTreeNode pQueue = new LinkedList();
            ListTreeNode qQueue = new LinkedList();
            pQueue.add(p);
            qQueue.add(q);
    
            while(!pQueue.isEmpty()) {
                p = pQueue.remove(0);
                q = qQueue.remove(0);
    
                if(p == null && q == null) {
                    continue;
                }
                if(p == null || q == null) {
                    return false;
                }
                if(p.val != q.val) {
                    return false;
                }
                pQueue.add(p.left);
                pQueue.add(p.right);
    
                qQueue.add(q.left);
                qQueue.add(q.right);
            }
            return true;
        }
    }
    

    复杂度分析:
    时间复杂度: O(n)
    空间复杂度: O(n)

    参考资料

    1. 相同的树: https://leetcode-cn.com/problems/same-tree/

    原文始发于微信公众号(xiaogan的技术博客):

    本人花费半年的时间总结的《Java面试指南》已拿腾讯等大厂offer,已开源在github ,欢迎star!

    本文GitHub https://github.com/OUYANGSIHAI/JavaInterview 已收录,这是我花了6个月总结的一线大厂Java面试总结,本人已拿大厂offer,欢迎star

    原文链接:blog.ouyangsihai.cn >> 100. 相同的树


      转载请注明: 好好学java 100. 相同的树

     上一篇
    104&111. 二叉树的深度 104&111. 二叉树的深度
    建议优先阅读,该文详细介绍了二叉树不同遍历方式的各种实现。 111. 二叉树的最小深度本题来自 LeetCode:二叉树的最小深度[1] 题目详情给定一个二叉树,找出其最小深度。最小深度是从根节点到最近叶子节点的最短路径上的节点数量。说明:
    2021-04-05
    下一篇 
    二叉树遍历专题 二叉树遍历专题
    今天来全面学习下二叉树的几种遍历方式,包括 前序遍历、 中序遍历、 后序遍历、 层次遍历。定义以下数据结构为二叉树的节点。 public class TreeNode { int val; TreeNode left;
    2021-04-05