LeetCode刷题Easy篇两个二叉树是否相同

题目

Given two binary trees, write a function to check if they are the same or not.

Two binary trees are considered the same if they are structurally identical and the nodes have the same value.

Example 1:

Input:     1         1
          / \       / \
         2   3     2   3

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

Output: true

Example 2:

Input:     1         1
          /           \
         2             2

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

Output: false

Example 3:

Input:     1         1
          / \       / \
         2   1     1   2

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

Output: 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 false;
        if(p.left!=null&&q.left!=null){
            isSameTree(p.left,q.left);
        }
        if(p.right!=null&&q.right!=null){
             isSameTree(p.right,q.right);
        }
        return p.val==q.val;
        
    }
}

第一版本我出现了错误,1-2 和1-null-2无法处理。整理一下思路,因为是递归,我们看单个节点如何判断相等是否,分几个情况:

第一:如果p和q都存在这个节点,并且值相同,则true

第二:如果p和q只有一个存在这个节点,返回false;

第三:如果pq都存在,值不同,false

第四:都不存在,true

递归调用左边和右边,修改后代码如下:

/**
 * 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);       
        
    }
}

非递归解法

本来只是写了递归写法,当时对于二叉树没有解题思路,后面写了二叉树是否相同后,总结出二叉树非递归的解题思路,所以重新回来,尝试写一些非递归思路,完美解决:

/**
 * 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) {
        Queue<TreeNode> queue=new LinkedList();
        queue.add(p);
        queue.add(q);
        while(!queue.isEmpty()){
            TreeNode node1=queue.poll();
            TreeNode node2=queue.poll();
            //开始写成了return,直接返回,应该继续
            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;      
        
    }
}

猜你喜欢

转载自blog.csdn.net/hanruikai/article/details/84393053