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. UNIX网络编程——客户/服务器程序设计示范(六)

    TCP并发服务器程序,每个客户一个线程 前面讲述了,每个客户一个进程的服务器,或为每个客户现场fork一个子进程,或者预先派生一定数目的子进程.如果服务器主机支持线程,我们就可以改用线程以取代子进程. ...

  2. EBS的性能调优

         metalink    Tuning performance on eBusiness suite (Doc ID 744143.1) 这篇文档描述了如何调查电子商务套件的整体性能下降. ...

  3. 【Linux驱动】字符设备驱动

    一.linux系统将设备分为3类:字符设备.块设备.网络设备.使用驱动程序: 1.字符设备:是指只能一个字节一个字节读写的设备,不能随机读取设备内存中的某一数据,读取数据需要按照先后数据.字符设备是面 ...

  4. CMake设置FOLDER失败及解决

    CMake可以设置FOLDER属性,用来分目录组织VC中的多个工程. FOLDER: Set the folder name. Use to organize targets in an IDE. T ...

  5. HBase作为存储方案

    HBase存储特点 * Client 1. 包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息. * Zookeeper: 1. 选举集群中的Master, ...

  6. Android开发技巧——PagerAdapter实现类的封装

    ViewPager是android的support库中的一个控件,也是一个在许多应用开发中都用得比较多的控件.目前为止,对ViewPager的使用,我一般是用ViewPager + Fragment的 ...

  7. SIM900A设备在保加利亚无法正常使用GPRS问题

    1.      SIM900A设备在保加利亚GPRS功能无法正常使用 我们一款手持设备采用SIM900A模块,在发货之前测试正常,但到了保加利亚,客户发现无法正常上网,我们技术支持反馈的邮件反馈的现象 ...

  8. 控件之combox

    一. combox显示     首先combox有两个属性来存储数据:DisplayMember(显示成员),ValueMember(值成员) ,DisplayMember是我们在combox界面上看 ...

  9. JAVA之旅(十六)——String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较

    JAVA之旅(十六)--String类,String常用方法,获取,判断,转换,替换,切割,子串,大小写转换,去除空格,比较 过节耽误了几天,我们继续JAVA之旅 一.String概述 String时 ...

  10. Demand Side Platform

    DSP特点: DSP不是从网络媒体那里包买广告位,也不是采用CPD(Cost Per Day)的方式获得广告位:而是从广告交易平台(AdExchange)来通过实时竞价的方式获得对广告进行曝光的机会, ...