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

題目分析:

給定一個二叉樹,原地將它展開爲鏈表。例如,給定二叉樹
在這裏插入圖片描述
將其展開爲:
在這裏插入圖片描述
解題思路:

看其展開的順序是類似前序遍歷,但是解題還是需要思路,二叉樹一般可以用遞歸和非遞歸解決
(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

參考博客

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章