【题目】
给你一棵二叉搜索树,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例 1:
输入:root = [5,3,6,2,4,null,8,1,null,null,null,7,9]
输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9]
示例 2:
输入:root = [5,1,7]
输出:[1,null,5,null,7]
提示:
树中节点数的取值范围是 [1, 100]
0 <= Node.val <= 1000
【代码】
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, val=0, left=None, right=None):
# self.val = val
# self.left = left
# self.right = right
class Solution:
def increasingBST(self, root: TreeNode) -> TreeNode:
stack=[]
node=root
ans=[]
while stack or node:
while node:
stack.append(node)
node=node.left
node=stack.pop()
ans.append(node.val)
node=node.right
root.val=ans[0]
root.right=None
root.left=None
node=root
for i in range(1,len(ans)):
rear=TreeNode(ans[i])
rear.right=None
rear.left=None
node.right=rear
node=rear
return root
【方法2:递归法】
class Solution:
def inOrder(self,root):
if not root:
return
self.inOrder(root.left)
self.ans.append(root.val)
self.inOrder(root.right)
def increasingBST(self, root: TreeNode) -> TreeNode:
self.ans=[]
self.inOrder(root)
root.val=self.ans[0]
root.right=None
root.left=None
node=root
for i in range(1,len(self.ans)):
rear=TreeNode(self.ans[i])
rear.right=None
rear.left=None
node.right=rear
node=rear
return root
【方法3】
class Solution:
def inOrder(self,root):
if not root:
return
self.inOrder(root.left)
temp=root.right
root.left=root.right=None
self.h.right=root
self.h=root
self.inOrder(temp)
def increasingBST(self, root: TreeNode) -> TreeNode:
self.rs=TreeNode(0)
self.rs.left=self.rs.right=None
self.h=self.rs
self.inOrder(root)
return self.rs.right