Symmetric Tree

一位编程新手分享了自己在解决LeetCode首个问题时的思考过程和遇到的问题,从层次遍历、数组应用到最终实现代码,详细记录了从困惑到解决的心路历程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

从今开始刷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第一题的心路历程~~赶脚我的表达能力实在是有待提高。。编程能力更是如此。。

不过呢~~我会加油的!为了你我的未来!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值