100. Same Tree
一、题目
1、审题
2、分析
给出两个二叉树,判断这两个二叉树是否完全相同。
二、解答
1、思路:
方法一、
采用两个队列分别对两个二叉树进行层次遍历。
遍历时比较两个二叉树结点值是否相同。
public boolean isSameTree(TreeNode p, TreeNode q) { Queue<TreeNode> queue1 = new LinkedList<TreeNode>(); queue1.add(p); Queue<TreeNode> queue2 = new LinkedList<TreeNode>(); queue2.add(q); while(!queue1.isEmpty() && !queue2.isEmpty()) { TreeNode cur1 = queue1.poll(); TreeNode cur2 = queue2.poll(); if(cur1 != null && cur2 != null) { if(cur1.val != cur2.val) return false; queue1.add(cur1.left); queue1.add(cur1.right); queue2.add(cur2.left); queue2.add(cur2.right); } else if(cur1 == null && cur2 == null) continue; else return false; } return queue2.isEmpty() && queue1.isEmpty(); }
方法二、
采用一个队列存放 q、p 两个二叉树节点,每次比较时取出两个连续的队头节点进行比较。
public boolean isSameTree(TreeNode p, TreeNode q) { if(p == null && q == null) return true; if(p == null || q == null) return false; Queue<TreeNode> queue = new LinkedList<TreeNode>(); queue.add(p); queue.add(q); while(!queue.isEmpty()) { TreeNode cur1 = queue.poll(); TreeNode cur2 = queue.poll(); if(cur1 == null && cur2 == null) continue; else if(cur1 == null || cur2 == null || cur1.val != cur2.val) return false; queue.add(cur1.left); queue.add(cur2.left); queue.add(cur1.right); queue.add(cur2.right); } return true; }
方法三、
利用递归依次判断 left 与 right 子树是否相同。
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 isSameTree(p.left, q.left) && isSameTree(p.right, q.right); return false; }