题目
给你一个二叉树的根节点 root , 检查它是否轴对称。
输入: root = [1,2,2,null,3,null,3] 输出: false
题解
我们这里采用了迂回比较的方法,进入函数中先判断一下当前出参root
是否存在,如果不存在则直接返回false
,然后在声明一个queue
数组,里面首个参数是出参root
,在声明一个sub
空数组,在定义一个checkSymmetricList
函数用于判断左右两个节点是否相等,此函数接收一个list
的入参,在此函数中声明start
和end
变量,start
默认值是0
,end
变量默认值是list
出参的数据长度,然后使用循环,循环条件为当前的start
变量值小于end
变量值,在循环里面我们在进行判断当前的出参list
的start
变量位置数据和出参list
的end
变量位置数据是否相等,如果相等则start
变量自增1
,end
变量自减1
,逐渐往中间值靠近,如果不相等则返回false
,当循环结束后如果都相等则直接返回true
,函数声明完成后我们继续使用循环,循环的条件为只要queue
数组中只要还有数据就进行循环,在循环中声明一个len
变量,代表着queue
数组的数据长度,每次循环都需要重新获取下queue
数组数据长度并赋值给len
变量,在将sub
变量重新赋值为空数组,然后使用for
循环,只要当前循环变量值小于当前len
变量,就继续进行循环,在此循环中我们声明一个node
变量,它的值是queue
数组中的首个值,在判断当前node
变量是否存在,存在的话将当前node
变量的val
属性使用push
方法追加到sub
数组中,同时也将node
变量的左右节点使用push
追加到queue
数组中,如果不存在则直接往sub
数组中追加一个null
元素,然后我们在调用自身把当前sub
数组传递进去看返回的值是否为false
,如果为false
则返回false
,当函数执行完之后如果还没有返回false
的话则直接返回true
/** * @param {TreeNode} root * @return {boolean} */ var isSymmetric = function(root) { if(!root) return false let queue = [root] let sub = [] let checkSymmetricList = (list)=>{ let start = 0 let end = list.length - 1 while(start < end){ if(list[start] === list[end]){ start++ end-- }else{ return false } } return true } while(queue.length){ let len = queue.length sub = [] for(let i = 0; i < len; i++){ const node = queue.shift() if(node){ sub.push(node.val) queue.push(node.left,node.right) }else{ sub.push(null) } } if(!checkSymmetricList(sub)){ return false } } return true }