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

判断两个二叉树是否相等。

一:使用递归。

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;
}

二:根据遍历出来的顺序,但是由于遍历右左子树可能有一个为空,会影响结果。

class Solution {
StringBuilder sb1=new StringBuilder();
StringBuilder sb2=new StringBuilder();
public boolean isSameTree(TreeNode p, TreeNode q) {
/**遍历:出现左右子树只有一个为空时,用null代替存储。所以直接用StringBuilder来存储遍历的结果。 */
if(p==null&&q==null) return true;
if(p==null||q==null) return false; bianLi(p,sb1);
bianLi(q,sb2);
return sb1.toString().equals(sb2.toString()); } public void bianLi(TreeNode node,StringBuilder sb){
if(node!=null){
sb.append(node.val);
if(node.left!=null&&node.right!=null){
bianLi(node.left,sb);
bianLi(node.right,sb);
}
if(node.left!=null){
bianLi(node.left,sb);
sb.append("null");
}
if(node.right!=null){
sb.append("null");
bianLi(node.right,sb);
}
} }
}

但是,其实这里不需要输出遍历 的结果,只需要在遍历过程中对两者进行比较就行。

    public boolean isSameTree(TreeNode p, TreeNode q) {

        if(p==null&&q==null) return true;
if(p==null||q==null) return false; return bianLi2(p,q);
} public boolean bianLi2(TreeNode node1,TreeNode node2){
if(node1==null&&node2==null) return true;
if(node1!=null&&node2!=null){
if(node1.val!=node2.val) return false;
return bianLi2(node1.left,node2.left)&&bianLi2(node1.right,node2.right);
}
return false;
}

三:可以不使用递归,使用深度遍历方法,也不需要输出遍历结果,只需在遍历时判断即可

        if(p==null&&q==null) return true;
if(p==null||q==null) return false; //深度优先遍历 Stack<TreeNode> s1=new Stack<>();
Stack<TreeNode> s2=new Stack<>();
s1.push(p);
s2.push(q);
while(!s1.isEmpty()&&!s2.isEmpty()){
TreeNode node1=s1.pop();
TreeNode node2=s2.pop();
if(node1.val!=node2.val) return false;
if(node1.right!=null) s1.push(node1.right);
if(node2.right!=null) s2.push(node2.right);
if(s1.size()!=s2.size()) return false;
if(node1.left!=null) s1.push(node1.left);
if(node2.left!=null) s2.push(node2.left);
if(s1.size()!=s2.size()) return false;
}
return s1.size()==s2.size();

same tree(判断两颗二叉树是否相等)的更多相关文章

  1. 101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树

    给定一个二叉树,检查它是否是它自己的镜像(即,围绕它的中心对称).例如,这个二叉树 [1,2,2,3,4,4,3] 是对称的.    1   / \  2   2 / \ / \3  4 4  3但是 ...

  2. LeetCode 101 Symmetric Tree 判断一颗二叉树是否是镜像二叉树

    Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).For ex ...

  3. LeetCode 100. Same Tree 判断两棵二叉树是否相等 C++

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

  4. 【遍历二叉树】08判断两个二叉树是否相同【Same Tree】

    迭代版本用的是二叉树的DFS,中的root->right->left +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ...

  5. 判断一颗二叉树是否为二叉平衡树 python 代码

    输入一颗二叉树,判断这棵树是否为二叉平衡树.首先来看一下二叉平衡树的概念:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树.因此判断一颗二叉平衡树的关键在于 ...

  6. Same Tree 比较两个二叉树是否完全相同

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

  7. 剑指offer58:对称的二叉树。判断一颗二叉树是不是对称的,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的

    1 题目描述 请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 2 思路和方法 定义一种遍历算法,先遍历右子结点再遍历左子结点:如对称先序 ...

  8. Same Tree,判断两个二叉树是不是相同的树,结构相同,每个节点的值相同

    算法分析:这道题很简单,利用递归即可. public class SameTree { public boolean isSameTree(TreeNode p, TreeNode q) { if(p ...

  9. java实现判断两个二叉树是否相同

    1.定义树节点类:节点值.左节点.右节点.构造器 2.先判断树是否为空的情况 3.树不为空时,判断节点所指的值是否相等,若相等,则递归判断节点的左右节点是否相同,相同则返回true /** * Def ...

随机推荐

  1. Android简易实战教程--第二话《两种进度条》

    点击按钮模拟进度条下载进度,"下载"完成进度条消失. 代码如下: xml: <?xml version="1.0" encoding="utf- ...

  2. 极光推送---安卓Demo

    对于一个一直干.net的程序媛来说,冷不丁的让小编干安卓,那种感觉就好似小狗狗咬小刺猬一样,不知道从哪儿开始下手,对于小编来说,既是挑战更是机遇,因为知识都是相通的,再者来说,在小编的程序人生中,留下 ...

  3. 【一天一道LeetCode】#105. Construct Binary Tree from Preorder and Inorder Traversal

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 来源:http ...

  4. ffmpeg.c函数结构简单分析(画图)

    前一阵子研究转码的时候看了FFmpeg的源代码.由于ffmpeg.c的代码相对比较长,而且其中有相当一部分是AVFilter有关的代码(这一部分一直不太熟),因此之前学习FFmpeg的时候一直也没有好 ...

  5. Gradle 1.12 翻译——第十二章 使用Gradle 图形用户界面

    有关其他已翻译的章节请关注Github上的项目:https://github.com/msdx/gradledoc/tree/1.12,或访问:http://gradledoc.qiniudn.com ...

  6. sql一些常用的经典语句,最后是select as的用法

    总结一些工作中用到或碰到的SQL语句,希望能与大家分享,同时也希望大家能提供更多的精妙SQL语句..... 1.delete table1 from (select * from table2) as ...

  7. PageContext ServletContext ServletConfig辨析

    上面三个东西都是什么关系呀? 先看图 注意几点 1 GenericServlet有两个init方法# 2 GenericServlet既实现了ServletConfig方法,它自己由依赖一个Servl ...

  8. Android View事件机制一些事

    本文主要讲述: 自己对View事件机制的一些理解 在项目中遇到的一些坑,解决方案 收集了一些View的事件机制问题 事件的分发原理图 对于一个root viewgroup来说,如果接受了一个点击事件, ...

  9. android:background="@color/white" [create file color.xml at res/values/]

     <resources><color name="white">#FFFFFF</color><!--白色 --><col ...

  10. NSString的几种常用方法—韩俊强博…

    要把 "2011-11-29" 改写成 "2011/11/29"一开始想用ios的时间格式,后来用NSString的方法搞定. 1.创建NSString字符串 ...