leetcode:リカバリツリー(python)

6105 ワード

1.タイトルの説明
ツリー内の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  #