100. 相同的树 递归+非递归前中后序解法

#100. 相同的树

难度:简单

题目描述
在这里插入图片描述
解题思路
其实考察的就是二叉树的遍历,遍历一次如果全部相同就返回true,否则就返回false

1、递归解法

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

提交结果:
在这里插入图片描述

2、前序遍历判断

根左右,先入栈右孩子,再入栈左孩子

public boolean isSameTree1(TreeNode p, TreeNode q) {
  	if(p == null && q == null)
   		return true;
  	if(p == null) return false;
  	if(q == null) return false;
  	Stack<TreeNode> stackp = new Stack<>();
  	Stack<TreeNode> stackq = new Stack<>();
  	stackp.add(p);
  	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;
    }

提交结果:
在这里插入图片描述

3、中序遍历比较

左根右

public boolean isSameTree2(TreeNode p, TreeNode q) {
   	if(p == null && q == null)
    		return true;
   	if(p == null) return false;
   	if(q == null) return false;
   	Stack<TreeNode> stackp = new Stack<>();
   	Stack<TreeNode> stackq = new Stack<>();
   	while(p != null || q != null || !stackp.isEmpty() || !stackq.isEmpty()) {
    		if(p!= null && q != null) {  //不为空那左子树入栈
     		stackp.add(p);
     		stackq.add(q);
     		p = p.left;
     		q = q.left;
    	}
    		else if(p == null && q == null) {  //如果到一端的叶子节点,访问然后入栈右子树
     			p = stackp.pop();
     			q = stackq.pop();
     			if(p.val != q.val) return false;
     			p = p.right;
     			q = q.right;
    		}
    		else {
     			return false;
    		}
   	}
   return true;
    }

提交结果:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值