LeetCode101(dfs/bfs)
发布日期:2021-06-29 21:37:08 浏览次数:2 分类:技术文章

本文共 1848 字,大约阅读时间需要 6 分钟。

在这里插入图片描述
**dfs思路:**根据题目的描述,镜像对称,就是左右两边相等,也就是左子树和右子树是相等的。因此采用两个指针p,q分别指向左右两颗子树,在每次递归时候就判断一下当前节点是否相等,不相等则直接返回false,相等则继续递归下去,注意递归子树时候p,q指针同步指向问题,也就是说:
p的左孩子要和q的右孩子比较,p的右孩子要和q的左孩子进行比较。
最后递归的判断两颗子树即可。
下面引用一张图形象描述递归比较过程。中间递归返回的未显示出
在这里插入图片描述
bfs思路:类似层次遍历,只是我们需要注意入队的顺序。都到了叶子节点还需要将null入队。(当然也可以不入队直接判断左右孩子节点null情况)
代码:

/** * Definition for a binary tree node. * public class TreeNode { *     int val; *     TreeNode left; *     TreeNode right; *     TreeNode(int x) { val = x; } * } */class Solution {
public boolean isSymmetric(TreeNode root) {
if(root==null) return true; //return dfs(root.left,root.right); return bfs(root); } public boolean dfs(TreeNode p,TreeNode q){
if(p==null&&q==null) return true; if(p==null||q==null||p.val!=q.val) return false; return dfs(p.left,q.right)&&dfs(p.right,q.left); } public boolean bfs(TreeNode root){
if(root.right==null&&root.left==null) return true; Queue
queue = new LinkedList
(); queue.add(root.left); queue.add(root.right); while(queue.size()>0){
TreeNode p=queue.poll(); TreeNode q=queue.poll(); if(p==null&&q==null) continue; if(p==null||q==null||p.val!=q.val) return false;//注意先比较null再判断值,否则可能会空指针 queue.add(p.left); queue.add(q.right); queue.add(p.right); queue.add(q.left); } return true; }}

下表显示了jdk1.5中的阻塞队列的操作:

方法 作用 队满/空处理
add 增加一个元素 如果队列已满,则抛出一个IIIegaISlabEepeplian异常
remove 移除并返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
element 返回队列头部的元素 如果队列为空,则抛出一个NoSuchElementException异常
offer 添加一个元素并返回true 如果队列已满,则返回false
poll 移除并返问队列头部的元素 如果队列为空,则返回null
peek 返回队列头部的元素 如果队列为空,则返回null
put 添加一个元素 如果队列满,则阻塞
take 移除并返回队列头部的元素 如果队列为空,则阻塞

remove、element、offer 、poll、peek 其实是属于Queue接口。

转载地址:https://dh-butterfly.blog.csdn.net/article/details/108362186 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring系列 官方文档(中文翻译)
下一篇:JS深拷贝与浅拷贝的区别,实现深拷贝的几种方法

发表评论

最新留言

不错!
[***.144.177.141]2024年04月25日 07时22分22秒