相同的树

题目:相同的树

题目描述:给定两个二叉树,编写一个函数来检验它们是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。

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

/**

  • 相同的树
    */
    public class TreeNode {
    int val; //变量值
    TreeNode left; //左子树
    TreeNode right; //右子树

    public TreeNode(int i) {
    val = i;
    }

    public static void main(String[] args) {
    TreeNode t1 = new TreeNode(1);
    t1.left = new TreeNode(2);
    t1.right = new TreeNode(3);
    TreeNode t2 = new TreeNode(1);
    t2 = new TreeNode(2);
    t2.right = new TreeNode(1);
    boolean res = isSameTree(t1, t2);
    System.out.println(“这两棵树是否相同:”+res);

    }

    /**

    • 递归方法

    • @param p

    • @param q

    • @return
      */
      /*public static boolean isSameTree(TreeNode treeNode1, TreeNode treeNode2){
      if (treeNode1 == null && treeNode2 == null){ //两个数都为空,返回false
      return true;
      }
      if (treeNode1 == null){ //第一个树为空,返回false
      return false;
      }
      if (treeNode2 == null){ //第二棵树为空
      return false;
      }

      if (treeNode1.val == treeNode2.val){ //判断两棵树的值是否相等,不相等返回false。
      return isSameTree(treeNode1.left,treeNode2.left) && isSameTree(treeNode2.right,treeNode2.right);
      }else{
      return false;
      }
      }*/

    /**

    • 非递归方法,前序遍历,先根再左后右

    • @param p

    • @param q

    • @return
      */
      public static boolean isSameTree(TreeNode p, TreeNode q) {
      if(p == null && q == null)
      return true;
      if(p == null) return false;
      if(q == null) return false;
      //创建两个栈
      Stack stackp = new Stack<>();
      Stack stackq = new Stack<>();
      stackp.add§;
      stackq.add(q);
      while(!stackp.isEmpty() || !stackq.isEmpty()) { //如果栈不为空
      TreeNode pp = stackp.pop(); //移除堆栈顶部的对象,并将该对象作为函数的值返回
      TreeNode qq = stackq.pop();

       if(pp == null && qq == null) //两个节点为空时,不再入栈左孩子和右孩子
           continue;
       if(pp == null)
           return false;
       if(qq == null)
           return false;
       if(pp.val != qq.val)
           return false;
       else {                        //注意栈是后进先出,所以先入栈右子树,再入栈左子树
           stackp.add(pp.right);
           stackq.add(qq.right);
           stackp.add(pp.left);
           stackq.add(qq.left);
       }
      

      }
      return true;
      }

}

/**

  • 先判断是否都为空树,如果是就返回ture,
  • 在判断是否有一个空树,是就返回false,
  • 两个树都不为空,比较他们的val,如果不相等就返回false,
  • 相等的话,就遍历它的左右子树,直到不符合条件跳出.
    */
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值