首页 > 其他分享 >114. 二叉树展开为链表

114. 二叉树展开为链表

时间:2023-01-30 17:35:49浏览次数:43  
标签:None right self 链表 114 二叉树 child root left

问题描述

https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/

解题思路

这个题目,用一个数组就能很好的解决。但空间复杂度是O(n).

题目中给的进阶要求,是要空间复杂度为O(1),所以这就要求我们在递归时就要处理掉。

好,首先,我们先做递归函数的定义。即,递归函数返回的就是一个链表的头节点。

所以我们每一层要做的事情就是递归的处理左子树,递归的处理右子树,然后将左子树生成的链表、根节点以及右子树生成的链表合并成一个最终的链表并返回即可。

代码一

# Definition for a binary tree node.
# class TreeNode:
#     def __init__(self, val=0, left=None, right=None):
#         self.val = val
#         self.left = left
#         self.right = right
class Solution:
    def flatten(self, root: Optional[TreeNode]) -> None:
        """
        Do not return anything, modify root in-place instead.
        """
        if root is None or (root.left is None and root.right is None):
            return
        li = []
        def dfs(root):
            if root is None:
                return
            li.append(root)
            dfs(root.left)
            dfs(root.right)
        dfs(root)
        for i in range(len(li)-1):
            li[i].left = None
            li[i].right = li[i+1]
        li[-1].left, li[-1].right = None, None

 

代码二

class Solution:
    def flatten(self, root):
        """
        Do not return anything, modify root in-place instead.
        """
        if root is None:
            return
        if root.left is None and root.right is None:
            return root
        right_child = self.flatten(root.right)
        left_child = self.flatten(root.left)
        root.right = left_child
        root.left = None
        tmp_child = root
        while tmp_child.right:
            tmp_child = tmp_child.right
        tmp_child.right = right_child
        return root

 

标签:None,right,self,链表,114,二叉树,child,root,left
From: https://www.cnblogs.com/bjfu-vth/p/17076753.html

相关文章

  • 二叉树
    线索二叉树1、问题的提出2、线索二叉树的概念n个节点的二叉链表中包含有n+1个空指针域【2n-(n-1)=n+1】{如上图,n为6,空指针域为7},利用二叉链表中的空指针域,存放指......
  • [数据结构]二叉树的前中后序遍历(递归+迭代实现)
    二叉树的遍历主要的三种遍历方式二叉树主要的遍历方式有前序遍历、中序遍历和后序遍历。(1)前序遍历:根节点-->左子树-->右子树(2)中序遍历:左子树-->根节点-->右子树(3)后序......
  • LeetCode:1669. 合并两个链表
    /***Definitionforsingly-linkedlist.*structListNode{*intval;*ListNode*next;*ListNode():val(0),next(nullptr){}*ListN......
  • 力扣257 二叉树的所有路劲
    题目:给你一个二叉树的根节点root,按任意顺序,返回所有从根节点到叶子节点的路径。叶子节点是指没有子节点的节点。示例:输入:root=[1,2,3,null,5]输出:["1->2->......
  • LeetCode-21.合并两个有序链表
    21.合并两个有序链表(MergeTwoSortedLists)将两个升序链表合并为一个新的升序链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。示例1:输入:l1=[1,2,4......
  • 完整的合并有序链表(包括节点定义 生成链表 合并)
    1.定义节点publicclassListNode{intval;ListNodenext;publicListNode(){}publicListNode(intval){this.val=val;......
  • 双向链表 添加与遍历
    packagecom.pay.test;//定义节点publicclassDoubleLinkedList{//初始化头节点privateHeroNodehead=newHeroNode(0,"","");//返回节点头p......
  • 二叉树遍历 前序 中序 后序
    packagecom.pay.test;importjava.util.LinkedList;publicclassNode{privateIntegerdata;privateNodeleft;privateNoderight;publ......
  • 力扣110 平衡二叉树
    题目:给定一个二叉树,判断它是否是高度平衡的二叉树。本题中,一棵高度平衡二叉树定义为:一个二叉树每个节点的左右两个子树的高度差的绝对值不超过1。示例:输入:root......
  • 力扣222 完全二叉树
    题目:给你一棵完全二叉树的根节点root,求出该树的节点个数。完全二叉树的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面......