【LeetCode】114. Flatten Binary Tree to Linked List 解题报告(Python)

127 篇文章 2 订阅
44 篇文章 1 订阅

题目分析:

给定一个二叉树,原地将它展开为链表。例如,给定二叉树
在这里插入图片描述
将其展开为:
在这里插入图片描述
解题思路:

看其展开的顺序是类似前序遍历,但是解题还是需要思路,二叉树一般可以用递归和非递归解决
(1)递归
变换过程

			1
		  /    \
		 2      5
	    / \      \
	   3   4      6

			1
		  /    \
		 2      5
	      \      \
	       3      6
		    \
		     4
		     
			1
		     \
		   	  2    
	  		   \    
	    		3     
		          \
		           4
		            \
		             5
		              \
		               6
  1. 一直找左节点,直到没左节点了
self.flatten(root.left)
  1. 返回一层,递归右节点
self.flatten(root.right)
  1. 备份右节点
tmp = root.right
  1. 完毕后将当前节点的右节点设置为当前节点的左节点,同时将当前左节点设为None
root.right = root.left
root.left = None
  1. 将备份的右节点添加到现在右节点的末尾
while root.right: root = root.right
root.right = tmp
  1. 返回上一层递归

(2)非递归,循环解决
变换过程

			1
		  /    \
		 2      5
	    / \      \
	   3   4      6

			1
		     \
			  2    
	         /  \     
	        3    4
		          \
		           5
		            \
		             6
		     
			1
		     \
		   	  2    
	  		   \    
	    		3     
		          \
		           4
		            \
		             5
		              \
		               6
  1. 备份根节点
bf_root = root
  1. 备份根节点右节点
p = bf_root.left
  1. 寻找到左节点下的最后一个右节点
while p.right: p = p.right

  1. 将备份的根节点的右节点作为根节点左节点的最后一个右节点
p.right = bf_root.right
  1. 将根节点的右节点设置为当前根节点的左节点,同时左节点设置为None
bf_root.right = bf_root.left
bf_root.left = None
  1. 循环上述步骤

提交代码1:(递归,Runtime: 36 ms, faster than 98.79% )

class Solution:
    def flatten(self, root: TreeNode) -> None:
        if root:
            self.flatten(root.left)
            self.flatten(root.right)
            tmp = root.right
            root.right = root.left
            root.left = None
            while root.right: root = root.right
            root.right = tmp

提交代码2:(循环,Runtime: 36 ms, faster than 98.79% )

class Solution:
    def flatten(self, root: TreeNode) -> None:
        bf_root = root
        while bf_root:
            if bf_root.left:
                p = bf_root.left
                while p.right: p = p.right
                p.right = bf_root.right
                bf_root.right = bf_root.left
                bf_root.left = None
            bf_root = bf_root.right

参考博客

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值