226.翻转二叉树、101. 对称二叉树

54 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第11天,点击查看活动详情

226.翻转二叉树

题目解析

题目要求翻转二叉树,也就是将节点的左右孩子互换。这道题有很多种解法,因为二叉树有很多种遍历的方式。但是在这里由于是一刷,我就只使用最简单递归的方式解决。

解决

这道题的解决如下:

var invertTree = function(root) {
    if(!root) {
        return null
    }
    const rightNode = root.right
    root.right = invertTree(root.left)
    root.left = invertTree(rightNode)
    return root 
};

思路就是将根结点的右子节点暂存在一个变量中,在递归的将根节点的左右子节点调换。

101. 对称二叉树

题目分析

题目给出一个二叉树,要求检查它是否轴对称。轴对称就要求了这道题比较的并不是左右节点。

解决

  1. 确定递归函数的参数和返回值

递归函数的参数是要比较的左右两边的节点,返回值是一个布尔值

  1. 确定终止条件

终止条件就是当左右不轴对称的时候。首先判断节点为空的情况:第1种是左节点为空,但是右节点并不为空,那么就不对称;第2种是左节点为空,但是右节点为空也不对称;第3点是左右都为空,那么就是对称的。

另外当所有节点都不会空的时候,比较节点数字,相同就返回true不相同返回false。

  1. 确定单层循环逻辑

单层地柜的逻辑就是比较二叉树外侧和内侧是否对称,如果都对称就返回trie,否则返回false。

代码如下:

var isSymmetric = function(root) {
    const compareNode = function(left,right) {
        if(left === null && right !== null || left !== null && right === null) return false
        else if(left === null && right === null) return true
        else if(left.val !== right.val) return false
        let outSide = compareNode(left.left,right.right)
        let inSide = compareNode(left.right,right.left)
        return outSide && inSide
    }
    if(root === null) return true
    return compareNode(root.left,root.right)
};

总结

这两题中第1题比较简单,第2题要考虑很多情况,最好在写代码前就清楚的列出。