Leetcode 100 相同的树

Leetcode 100相同的树

数据结构定义:

给定两个二叉树,编写一个函数来检验它们是否相同。

如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

示例 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

递归写法:

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){
            boolean left = isSameTree(p.left,q.left);
            boolean right = isSameTree(p.right,q.right);
            return left && right;
        }
        return false;
    }
}

广度优先遍历迭代:

/*
* 思路: 运用两个Queue 分别保存两颗树的节点信息,并依次比较
*
*/
class Solution {
      public boolean isSameTree(TreeNode p, TreeNode q) {
      if(!checkSameTreeNode(p,q)){
          return false;
      }
      Queue<TreeNode> queueP = new LinkedList<>();
      Queue<TreeNode> queueQ = new LinkedList<>();
      queueP.add(p);
      queueQ.add(q);
      while(!(queueP.isEmpty() || queueQ.isEmpty())){
          TreeNode nodeP = queueP.poll();
          TreeNode nodeQ = queueQ.poll();
          if(!checkSameTreeNode(nodeP,nodeQ)){
              return false;
          }
          if(nodeP != null){
              queueP.add(nodeP.left);
              queueP.add(nodeP.right);
          }
          if(nodeQ != null){
              queueQ.add(nodeP.left);
              queueQ.add(nodeQ.right);
          }
      }
      return true;
    }

    private boolean checkSameTreeNode(TreeNode p, TreeNode q){
        if(p == null && q == null)
            return true;
        if(p == null || q == null)
            return false;
        if(p.val == q.val)
            return true;
        return false;
    }
}
posted @ 2020-11-26 14:20  0xHigos  阅读(52)  评论(0编辑  收藏  举报