leetcode-100

Given the root nodes p and q of two binary trees, write a function to check whether the two trees are the same.
Two trees are considered identical if they are structurally identical and the nodes have the same value.
insert image description here

Tip:
The number of nodes on both trees is in the range [0, 100]
-104 <= Node.val <= 104

Node definition (java version):

/**
 * Definition for a binary tree node.
 * public class TreeNode {
 *     int val;
 *     TreeNode left;
 *     TreeNode right;
 *     TreeNode() {}
 *     TreeNode(int val) { this.val = val; }
 *     TreeNode(int val, TreeNode left, TreeNode right) {
 *         this.val = val;
 *         this.left = left;
 *         this.right = right;
 *     }
 * }
 */

Idea 1:
Using the idea of ​​depth-first traversal, two trees are traversed, and the leaf nodes are compared one by one during the traversal process.

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        // 判断为null的情况,两个节点都为null,则返回true,不再遍历
        if(p == null && q == null){
            return true;
        }
        // 一个节点为null,则返回false,不再遍历
        if(p == null){
            return false;
        }
        if(q == null){
            return false;
        }
        // 如果两个节点都不为null,且两个节点的值不一致,则返回false,不再遍历
        if(p.val != q.val){
            return false;
        }
        // 递归遍历两个节点的左节点是否一致,若左节点一致,则再遍历右节点
        if(isSameTree(p.left,q.left)){
            return isSameTree(p.right, q.right);
        }
        return false;
    }
}

Idea 2:
Using the idea of ​​breadth-first traversal, two trees are traversed, and the leaf nodes are compared one by one during the traversal process.
Breadth-first traversal uses the first-in-first-out feature of the queue to flatten the tree and compare them one by one

class Solution {
    public boolean isSameTree(TreeNode p, TreeNode q) {
        Queue<TreeNode> queueLeft = new LinkedList();
        Queue<TreeNode> queueRight = new LinkedList();
        queueLeft.add(p);
        queueRight.add(q);
        while(!queueLeft.isEmpty() && !queueRight.isEmpty()){
            TreeNode l = queueLeft.poll();
            TreeNode r = queueRight.poll();
            if(l == null && r != null ){
                return false;
            }
            // 注意:两个对比的节点都为null的时候,说明这两个节点相等,还需要排查后续节点,所以是continue
            if(l == null && r == null){
                continue;
            }
            if(l != null && r == null){
                return false;
            }
            if(l.val == r.val){
                queueLeft.add(l.left);
                queueLeft.add(l.right);
                queueRight.add(r.left);
                queueRight.add(r.right);
                continue;
            }
            return false;
        }
        return queueLeft.isEmpty() && queueRight.isEmpty();
    }
}

Guess you like

Origin blog.csdn.net/whodarewin2005/article/details/129379223