06 最详细的反转二叉树解法说明

89 阅读1分钟

leetcode.cn/problems/in…

解题思路

考虑一种情况输入的数据只有一层节点或者空节点即 [2,3,4] 或者是 null ,怎样实现反转?

这可以说是一个n层反转树的子问题 image.png

  1. 判断是否是null
  2. inver node, 反转左右节点
var inverSingleTree = (root) {
    if(root == null) return null
    // 左右值
    const left = {val: root.left, left: null,right: null}
    const right = {val: root.right, left: null,right: null}
    
    root.left = right
    root.right = left
    return root
}

考虑另一种情况输入的数据是两层节点或者空节点即 [2,3,4,5,7,8,3] 或者是 null ,那么针对这种情况的解法

image.png

  1. 判断是否是null
  2. inver node, 反转左右节点

var inverDoubleTree = (root) {
    // 对于最底层节点进行反转
    root.left = inverSingleTree(root.left)
    root.right = inverSingleTree(root.right)
    // 对于第二层节点进行反转 
    root.left = root.right
    root.right = root.left
    // 反转完成
    return root
}

从以上可以看出,考虑三层节点的话

var inverTribleTree = (root) {
    // 对于最底层节点进行反转
    root.left = inverDoubleTree(root.left)
    root.right = inverDoubleTree(root.right)
    // 对于最底层节点进行反转
    root.left = right
    root.right = left
    return root
}

对于n层树的invert的话,采用 递归 将数据向下递至最底层节点即处理 单个节点后, 再将数据反转后,再将数据向上归处理所有的上层节点,以此类推

/**
 * Definition for a binary tree node.
 * function TreeNode(val, left, right) {
 *     this.val = (val===undefined ? 0 : val)
 *     this.left = (left===undefined ? null : left)
 *     this.right = (right===undefined ? null : right)
 * }
 */
/**
 * @param {TreeNode} root
 * @return {TreeNode}
 */
var invertTree = function (root) {
    if(root == null) return null
    // 将数据 向下递 至最底层节点
    const left = invertTree(root.left)
    const right = invertTree(root.right)
    // 反转操作
    root.right = left
    root.left = right
    // 将反转后的数据 向上归 后处理所有的上层节点
    return root
}