https://oj.leetcode.com/problems/same-tree/

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

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

/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null)
  return true;
if(p != null && q != null && p.val == q.val){
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}else{
  return false;
     }
}
}

解题思路:

递归。两个树相等,当且仅当当前节点value相等,并且左右两个子树也都相等。

退出条件:

当前节点为空。

注意点:

搞清楚当前阶段null和left或right为null的区别。

或者下面的代码更清楚一点

/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
if(p == null && q == null){
return true;
}else if(p == null && q != null){
return false;
}else if(p != null && q == null){
return false;
}else if(p.val != q.val){
return false;
}else{
//if(p.val == q.val)
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
}

还有一种解法,不是很straight forward,但是给了另一种思路。

和 Anagrams 的题目类似,我们考虑给same tree一样的一种code,或者叫签名,不同的tree不同的code。这样对两棵树进行操作后,比较他们的code就可以了。这实际上是一种serializatin的思路——将二叉树序列化表示。

这里直接讲出结论,只有preorder和level order的traversal是可以序列化二叉树的,inorder和postorder不可以,得出的code无法回头生成原来的二叉树。思考一下,为什么?代码直接给出,如下。

/**
* Definition for binary tree
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
public class Solution {
public boolean isSameTree(TreeNode p, TreeNode q) {
StringBuffer result_p = new StringBuffer();
StringBuffer result_q = new StringBuffer(); preOrder(p, result_p);
preOrder(q, result_q); return result_p.toString().equals(result_q.toString());
} public void preOrder(TreeNode root, StringBuffer result){
if(root == null){
result.append("#");
return;
}
result.append(root.val);
preOrder(root.left, result);
preOrder(root.right, result);
}
}

最新文章

  1. 交互式makefile
  2. Openstack+Kubernetes+Docker微服务实践之路--弹性扩容
  3. 利用LruCache为GridView异步加载大量网络图片完整示例
  4. radio button(单选按钮)
  5. eXosip2代码分析
  6. Part 6 Group by in sql server
  7. java_设计模式_观察者模式_Observer Pattern(2016-07-27)
  8. linux cmd: ps
  9. oracle学习笔记(1)-三级模式SCHEMA
  10. linux 每个小时释放一次cache
  11. linux vi粘贴格式易错乱
  12. db2一、查询
  13. docker配置阿里云镜像加速
  14. hive分区表
  15. pip in windows
  16. kotlin-2(IdeaIU-2018.2汉化破解)
  17. java疯狂讲义--摘要
  18. linux下查看和修改文件时间
  19. CentOS6.5安装vncserver实现图形化访问
  20. 如何快速开发一个支持高效、高并发的分布式ID生成器

热门文章

  1. sqlserver同一个局域网内,把服务器数据库备份到客户端
  2. 82-Ichimoku Kinko Hyo 一目平衡表.(2015.7.3)
  3. MSP430F5529时钟系统深究
  4. Mysql学习总结(43)——MySQL主从复制详细配置
  5. STM32F407 跑马灯 寄存器版 个人笔记
  6. Eclipse调试相关
  7. [BZOJ3555] [Ctsc2014]企鹅QQ(Hash)
  8. [NOIP2006] 提高组 洛谷P1064 金明的预算方案
  9. 安装最新版本的zabbix
  10. 洛谷 P4379 [USACO18OPEN]Lemonade Line