题目
给你一个二叉树的根节点 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 }