从今开始刷leetcode,在此记录下心路历程~~~~
我是菜鸟,对于语言、数据结构统统一知半解只懂皮毛,算法更是屁都不会,唯有一颗想要成为大牛的心!~~
写此博客一是为了能够留下做此题时的思路,二是为了能够以后回顾时方便,三是为了能够督促自己成长,四是为了能够锻炼一下表达能力。。。当然,最重要的也是为了我最爱的人,能够让我下此决心的也只有你了
好了,言归正传
题目如下:
Given a binary tree, check whether it is a mirror of itself (ie, symmetric around its center).
For example, this binary tree is symmetric:
1 / \ 2 2 / \ / \ 3 4 4 3
But the following is not:
1 / \ 2 2 \ \ 3 3
判断一个树是否是对称的,上来我的思路就是运用层次遍历,把每一层节点的值放在一个数组中(空节点的话值就是"#")。每次循环开始先判断队列中的节点是否是新一层的开始(出队的节点的计数count是否达到了该层节点的最大值max),是新一层的开始的话则首先判断记录节点值的数组是否是对称的,是的话将数组置空,更新max和count的值继续流程;如果不是的话跳出循环结束判断。。。然后我就去写代码了。。。结果。。。情况百出。。。
首先是没有处理好根节点,造成层次遍历出队时数组中的值有问题,比如上图中第二层对应的数组值应为{2, 2},但结果变成了{1, 2},必然得到错误答案。。索性无视根节点,直接将根节点的左右孩子入队,解决了这一问题。
其次发现使用数组记录节点值的话会有问题,数组初始化时大小设为了max,而max的值设为了该层中最大节点数量(即为2^(i-1)),没有考虑到这不总会是一颗完全二叉树,导致如下图中最后一层的数组值为{4, #, #, 4, null, null, null, null},整个数组并不是对称的,结果出错。所以增加了每层非空结点的计数,下一层节点数量(包括空节点)应为上一层节点数量的2倍,并用arrayList代替数组,解决这一问题。
1 / \ 2 2 / \ 3 3 / \ 4 4
最后代码如下
public boolean isSymmetric(TreeNode root) {
if(root == null) //空树跳出
return true;
TreeNode node;
List<String> valArray = new ArrayList<String>();
int j = 0, count = 0, max = 2, notNull = 0; //notNull 每层非空结点数, max 每层最大节点数, count层中计数
Queue<TreeNode> queue = new LinkedList<TreeNode>();
queue.offer(root.left);
queue.offer(root.right);
while(!queue.isEmpty()) {
<span style="white-space:pre"> </span>if(count == max) {
for(j = 0 ; j < valArray.size() / 2 ; ++j) {
if(!valArray.get(j).equals(valArray.get(valArray.size() - j - 1))) {
<span style="white-space:pre"> </span>return false;
}
}
max = notNull * 2;
count = 0;
notNull = 0;
valArray.clear();
}
node = queue.poll();
if(node != null) {
queue.offer(node.left);
queue.offer(node.right);
valArray.add(node.val + "");
count++;
notNull++;
}
else {
valArray.add("#");
count++;
}
}
for(j = 0 ; j < valArray.size() / 2 ; ++j) {
if(!valArray.get(j).equals(valArray.get(valArray.size() - j - 1))) {
return false;
}
}
return true;
}
以上就是LeetCode第一题的心路历程~~赶脚我的表达能力实在是有待提高。。编程能力更是如此。。
不过呢~~我会加油的!为了你我的未来!