Morris遍历可以在空间复杂度为O(1),时间复杂度为O(n)
二叉搜索树
前驱结点:节点val值小于该节点val值并且值最大的节点,A节点的前驱是B,就是B恰好比A小
后继节点:节点val值大于该节点val值并且值最小的节点
记作当前节点为cur。
如果cur无左孩子,cur向右移动(cur=cur.right)
如果cur有左孩子,找到cur左子树上最右的节点,记为mostright
如果mostright的right指针指向空,让其指向cur,cur向左移动(cur=cur.left)
如果mostright的right指针指向cur,让其指向空,cur向右移动(cur=cur.right)
Morris遍历的原理可以代入到这个图里看看
最后参照的是这个题解,代码没搞懂
class Solution:
def recoverTree(self, root: Optional[TreeNode]) -> None:
pred = None
x = None # 1st wrong node
y = None # 2nd wrong node
def findPredecessor(root: Optional[TreeNode]) -> Optional[TreeNode]:
pred = root.left
while pred.right and pred.right != root:
pred = pred.right
return pred
while root:
if root.left:
morrisPred = findPredecessor(root)
if morrisPred.right: # already connected before
# start the main logic
if pred and root.val < pred.val:
y = root
if not x:
x = pred
pred = root
# end of the main logic
morrisPred.right = None # break the connection
root = root.right
else:
morrisPred.right = root # connect it!
root = root.left
else:
# start the main logic
if pred and root.val < pred.val:
y = root
if not x:
x = pred
pred = root
# end of the main logic
root = root.right
x.val,y.val = y.val,x.val