leetcode:リカバリツリー(python)
6105 ワード
1.タイトルの説明
ツリー内の2つのノードが誤って交換されました.
構造を変えずに、この木を復元してください.
例1:
入力:[1,3,null,null,2]
出力:[3,1,null,null,2]
例2:
入力:[3,1,4,null,null,2]
出力:[2,1,4,null,null,3]
ステップアップ:定数のみのストレージスペース.
2.考え方
二叉検索ツリーが表示され、通常は中順遍歴に関連付けられます.二叉探索ツリーの中順遍歴シーケンスは、昇順に配列された配列である.また,この問題では,二叉探索ツリー全体が2つのノードだけが誤って交換されていることを示した.したがって、この2つのノードを見つけて交換するだけです.
この二つの点を探して
最初のノードは、最初に中順に遍歴したときに前のノードが後のノードより大きいので、前のノードを選択します.2番目のノードは、1番目のノードが見つかった後、後ろに前のノードが後のノードより大きく現れ、後のノードを選択します.
したがって、3つのグローバル変数を設定し、再帰中に3つの変数を更新する必要があります.
2.1 pythonコード
ツリー内の2つのノードが誤って交換されました.
構造を変えずに、この木を復元してください.
例1:
入力:[1,3,null,null,2]
1
/
3
\
2
出力:[3,1,null,null,2]
3
/
1
\
2
例2:
入力:[3,1,4,null,null,2]
3
/ \
1 4
/
2
出力:[2,1,4,null,null,3]
2
/ \
1 4
/
3
ステップアップ:定数のみのストレージスペース.
2.考え方
二叉検索ツリーが表示され、通常は中順遍歴に関連付けられます.二叉探索ツリーの中順遍歴シーケンスは、昇順に配列された配列である.また,この問題では,二叉探索ツリー全体が2つのノードだけが誤って交換されていることを示した.したがって、この2つのノードを見つけて交換するだけです.
この二つの点を探して
最初のノードは、最初に中順に遍歴したときに前のノードが後のノードより大きいので、前のノードを選択します.2番目のノードは、1番目のノードが見つかった後、後ろに前のノードが後のノードより大きく現れ、後のノードを選択します.
したがって、3つのグローバル変数を設定し、再帰中に3つの変数を更新する必要があります.
2.1 pythonコード
class Solution:
def __init__(self):
"""
,firstNode
secondNode
preNode
"""
self.firstNode = None
self.secondNode = None
self.preNode = TreeNode(float("-inf"))
def recoverTree(self, root: TreeNode) -> None:
"""
Do not return anything, modify root in-place instead.
"""
if not root:
return
firstNode,secondNode = self.help(root)
firstNode.val,secondNode.val = secondNode.val,firstNode.val #
def help(self,root):
if not root:
return
self.help(root.left)
if self.firstNode == None and self.preNode.val >= root.val:
# firstNode , ,
# , 。
self.firstNode = self.preNode # firstNode
if self.firstNode and self.preNode.val >= root.val:
# , firstNode
self.secondNode = root # secondNode
self.preNode = root # preNode
self.help(root.right)
return self.firstNode,self.secondNode #