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

题目分析:

给定一个二叉树,原地将它展开为链表。例如,给定二叉树
在这里插入图片描述
将其展开为:
【LeetCode】114. Flatten Binary Tree to Linked List 解题报告(Python)_第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

参考博客

你可能感兴趣的:(python,LeetCode,递归,树)