一、需求
给你两棵二叉树的根节点 p
和 q
,编写一个函数来检验这两棵树是否相同。
如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。
示例 1
输入:p = [1,2,3], q = [1,2,3]
输出:true
示例 2
输入:p = [1,2], q = [1,null,2]
输出:false
示例 3
输入:p = [1,2,1], q = [1,1,2]
输出:false
提示:
- 两棵树上的节点数目都在范围
[0, 100]
内 -104 <= Node.val <= 104
二、思路图
深度优先搜索分析图
三、代码
提供的TreeNode类
package com.bessky.pss.wzw.SuanFa;
/**
* 94. 二叉树的中序遍历
*
* @author 王子威
* @date 2022/7/27
*/
public class TreeNode
{
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) {this.val = val;}
TreeNode(int val, TreeNode left, TreeNode right){
this.val = val;
this.left = left;
this.right = right;
}
}
测试方法
/**
* 入口
* 100. 相同的树
* 1.创建链表p
* 2.创建链表q
* 输入:
* TreeNode p = [1,2,3]
* TreeNode q = [1,2,3]
* 输出:
* result = true
* 解释:
* 1.递归
*/
@Test
public void suanfa20()
{
// 创建树
TreeNode q = new TreeNode(1, new TreeNode(3), new TreeNode(3));
// 创建树
TreeNode p = new TreeNode(1, new TreeNode(2), new TreeNode(3));
// 调用方法:迭代
boolean result = this.isSameTree(p, q);
System.out.println("results = " + result);
}
递归方法
/**
* 是否相同树
*
* @param p 二叉树1
* @param q 二叉树2
* @return
*/
public boolean isSameTree(TreeNode p, TreeNode q)
{
// 终止条件1:p与q树都为null,说明相等,返回true
if (p == null && q == null)
{
return true;
}
// 终止条件2:只有一方为null,说明两树不相等,返回false,所以||才要写在&&下面
else if (p == null || q == null)
{
return false;
}
// 树节点p与q的值不相等,就直接返回false
else if (p.val != q.val)
{
return false;
}
// 最优也就是两个节点都相等,那就继续递归他们下面的子节点,直到遍历所有节点
else
{
// 先递归左节点 && 在递归右节点 ,返回的值与上,都为true返回true
return isSameTree(p.left, q.left) && isSameTree(p.right, q.right);
}
}
结果图
作者:王子威
四、总结
- 学习了相同的树算法
- 还是没习惯把所有条件列出,方向对,没做到底,已经成通病
- 在日常中如果遇到,还是用递归会感觉方便些
- 除此还有一个算法可以实现(广度优先搜索),判断更多了些
- 算法兴趣+1 总:20
- 加强了对算法的分析能力