LeetCode 100. 相同的树

174 阅读1分钟

题目描述

image.png

思路

按照顺序,同步比较两个树的各个节点。

DFS

先考虑这两个节点val相等吗?

  • 如果相等,判断下一层,直到两者都是null,返回true
  • 不相等,直接返回false
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if (p == null && q == null) {
            return true;
        }
        //先考虑p.val = q.val吗,如果相等,那么往下一层比较。前面的条件是防止一边null,一边不null
        if (p != null && q != null && p.val == q.val) {
            return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
        } else {
            return false;
        }
    }
}

BFS

B758B95C8B91E8402D646D1E3166FC72.png

  • 按照图中的顺序遍历,能保证两棵树是按照一样的pace(一样的节点顺序)同步遍历的
    • 这样一来,while中一开始removeFirst两个,得到的是同样位置上的两个节点
//BFS
class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        LinkedList<TreeNode> queue = new LinkedList<>();
        //一开始加入两棵树的根节点
        queue.add(p);
        queue.add(q);
        while (!queue.isEmpty()) {
            TreeNode node1 = queue.removeFirst();
            TreeNode node2 = queue.removeFirst();
            if (node1 == null && node2 == null) {
                continue;
            }
            if (node1 == null || node2 == null) {
                return false;
            }
            if (node1.val != node2.val) {
                return false;
            }
            //注意添加顺序
            queue.add(node1.left);
            queue.add(node2.left);
            queue.add(node1.right);
            queue.add(node2.right);
        }
        return true;
    }
}