广度优先搜索在树中的应用——判断对称二叉树
Posted DataWatching
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了广度优先搜索在树中的应用——判断对称二叉树相关的知识,希望对你有一定的参考价值。
我这次分享的题目是我第一次完成了全网最高的解答,嘻嘻,说起来还有些小得意。
101. 对称二叉树
https://leetcode-cn.com/problems/symmetric-tree/
其实我们人的大脑是比较习惯用迭代的,毕竟递归的比较有技巧,所以,我们今天就分享一个迭代的例子,是的,就是我自己写的。
依然是广度优先搜索的思路,逐层遍历,逐层判断是否为对称,然后得到结果。注意这里我们需要比较两个要点:
1 当前的节点的左节点和右节点的结构是否对称,也就是不会出现题目中说的第二种不是镜像对称的情况
2 用两个临时的链表数组来存储临时的节点集合,这样就可以直接从当前的队列中一次性取头,取尾两个节点,然后进行比较
3 比较结束后记得把临时的链表数组存储的节点集合再次添加到队列中。
Talk is cheap. Show me the code.
public boolean isSymmetric(TreeNode root) {
if (root == null) {
return true;
}
// 你别看是个list,其实功能和队列一模一样
LinkedList<TreeNode> list = new LinkedList<>();
list.add(root);
while (list.size() > 0) {
int tempSize = list.size();
// 初始化一个list用来存储从左子树来的节点
LinkedList<TreeNode> tempListLeft = new LinkedList<>();
// 初始化一个list用来存储从右子树来的节点
LinkedList<TreeNode> tempListRight = new LinkedList<>();
while (tempSize > 0) {
// 如果只剩下单节点的话,那么判断条件就显得简单些。
if (tempSize == 1) {
TreeNode node = list.poll();
if (node.left != null && node.right != null) {
tempListLeft.add(node.left);
tempListRight.addFirst(node.right);
} else if (node.right == null && node.left == null);
else {
return false;
}
tempSize--;
} else {
// 取队列中的首部节点
TreeNode first = list.pollFirst();
// 取队列中的尾部节点
TreeNode last = list.pollLast();
if (first.val == last.val) {
// 接下来的代码真的有点冗余,就是判断左节点和右节点的结构是否相似,要满足镜像对称条件
// (1)全空
// (2)首部左节点不空,右节点空;尾部左节点空,右节点不空;
// (3)首部左节点空,右节点不空;尾部左节点不空,右节点空;
// (4)首部左节点不空,右节点不空;尾部左节点不空,右节点不空;
if (first.left == null && first.right == null && last.left == null && last.right == null) ;
else if (first.left != null && first.right == null && last.left == null && last.right != null) {
tempListLeft.add(first.left);
tempListRight.addFirst(last.right);
} else if (first.left == null && first.right != null && last.left != null && last.right == null) {
tempListLeft.add(first.right);
tempListRight.addFirst(last.left);
} else if (first.left != null && first.right != null && last.left != null && last.right != null) {
tempListLeft.add(first.left);
tempListLeft.add(first.right);
tempListRight.addFirst(last.right);
tempListRight.addFirst(last.left);
} else {
return false;
}
} else {
return false;
}
tempSize -= 2;
}
}
// 记得吧临时的存储的节点集合再次添加到队列中
list.addAll(tempListLeft);
list.addAll(tempListRight);
}
return true;
}
以上是关于广度优先搜索在树中的应用——判断对称二叉树的主要内容,如果未能解决你的问题,请参考以下文章