【LeetCode刷题】NO.44---第114题

113 阅读1分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

一.题目:

114. 二叉树展开为链表 给你二叉树的根结点 root ,请你将它展开为一个单链表:

  • 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。
  • 展开后的单链表应该与二叉树 先序遍历 顺序相同。 示例 1:

image.png

输入: root = [1,2,5,3,4,null,6]
输出: [1,null,2,null,3,null,4,null,5,null,6]

示例 2:

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

示例 3:

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

提示:

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

二、思路分析:

首先这道题目是中等难度的二叉树类型的题目,关于二叉树的题目首先要想到递归的思路,对于这道题目我们每次都要先找到一个数组中的最大值然后从最大值开始数组一分为二,然后再继续从左右两个子数组分别寻找最大值,再两个子数组找到最大值后继续将两个子数组分成4份更小的数组。

所以这样把大问题分解为同样的若干个小问题完美契合递归的思路,所以我们利用递归的思路去求解没有任何问题,我们只需要清楚函数的定义,知道函数该干什么即可。

三、代码:

/**
 * @param {number[]} nums
 * @return {TreeNode}
 */
var constructMaximumBinaryTree = function(nums) {
    if(nums.length == 0) return null
    let max = Math.max(...nums)
    let root = new TreeNode(max)
    let index = nums.indexOf(max)
    let leftnum = nums.slice(0,index)
    let rightnum = nums.slice(index+1)
    root.left = constructMaximumBinaryTree(leftnum)
    root.right = constructMaximumBinaryTree(rightnum)
    return root

};

四、总结:

到最后我们在题目中需要注意base case,因为递归中除了定义函数的作用外,最重要的就是设置函数的base case,所以我们完成了这些利用递归求解问题就很简单了。