100. Same Tree

Recursion:

public boolean isSameTree(TreeNode left, TreeNode right) {
    if (p == null || q == null) return p == q; // combine two cases: (p == null && p == null) and (p == null || q == null)
    return left.val == right.val && 
        isSameTree(left.left, right.left) && isSameTree(left.right, right.right);
}

Iteration: 在loop中找不同, 只用一个queue

public boolean isSameTree(TreeNode p, TreeNode q) {
    LinkedList<TreeNode> l1 = new LinkedList<>();
    LinkedList<TreeNode> l2 = new LinkedList<>();

    l1.add(p);
    l2.add(q);

    while (!l1.isEmpty()) { 
        TreeNode node1 = l1.remove();
        TreeNode node2 = l2.remove();

        if (node1 == null && node2 == null) continue;
        if (node1 == null || node2 == null) return false;
        if (node1.val != node2.val) return false;

        l1.add(node1.left);
        l2.add(node2.left);

        l1.add(node1.right);
        l2.add(node2.right);
    }
    return true;
}

难点:两个不一样的queue或者stack检查null exception

考虑几种边界情况

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

注意一些api的用法,arraylist和linkedlist可以有null,但arraydeque不行

public boolean isSameTree(TreeNode p, TreeNode q) {
    if (p == null && q == null) return true;
    if (p == null || q == null) return false; // different from linedlist

    Deque<TreeNode> l1 = new ArrayDeque<>();
    Deque<TreeNode> l2 = new ArrayDeque<>();

    l1.add(p);
    l2.add(q);

    while (!l1.isEmpty()) { // l1 or l2 can't be null at first
        TreeNode node1 = l1.remove();
        TreeNode node2 = l2.remove();

        if (!check(node1, node2)) return false;

        if (!check(node1.left, node2.left)) return false; // check intermediate node
        if (node1.left != null) { // check leaf node
            l1.add(node1.left);
            l2.add(node2.left);
        }

        if (!check(node1.right, node2.right)) return false; // check intermediate node
        if (node2.right != null) { // check leaf node
            l1.add(node1.right);
            l2.add(node2.right);
        }
    }
    return true;
}

public boolean check(TreeNode p, TreeNode q) {
    if (p == null || q == null) return p == q;
    return p.val == q.val;
}

results matching ""

    No results matching ""