Leetcode前端必会系列:翻转二叉树

92 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。

 

示例 1:

输入: root = [4,2,7,1,3,6,9]
输出: [4,7,2,9,6,3,1]

示例 2:

输入: root = [2,1,3]
输出: [2,3,1]

示例 3:

输入: root = []
输出: []

 

提示:

  • 树中节点数目范围在 [0, 100] 内
  • -100 <= Node.val <= 100

分析

根据题目的分析,我们如何设计翻转二叉树?由于二叉树是链表结构的,所以我们必须动态的交换递归的完成交换

  1. 设计二叉树交换左右孩子的核心递归函数
  2. 如果节点是空在,退出递归
  3. 持续的交换左右节点的指针,然后赋值
  4. 基于前序遍历完成最终的交换
  5. 返回根节点。

解答

/**

 * 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) {

    const main = node => {

        if(node) {

            let tmp = node.left

            node.left = node.right

            node.right = tmp

            node.left = main(node.left)

            node.right = main(node.right)

            return node

        }return null

    }

    return main(root)



};
   

根据代码,我们发现翻转二叉树地设计是基于递归完成的,我们必须依赖二叉树的前序遍历进行。

总结

通过上面二叉树翻转的设计,我们更加熟悉了其设计过程,基于二叉树的前序遍历轻松完成了翻转。