栈
树
深度优先搜索
二叉搜索树
二叉树
题目描述
给你一棵二叉搜索树的 root
,请你 按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点。
示例 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
解法
方法一:DFS 中序遍历
我们定义一个虚拟节点 $dummy$,初始时 $dummy$ 的右子节点指向根节点 $root$,定义一个指针 $prev$ 指向 $dummy$。
我们对二叉搜索树进行中序遍历,遍历过程中,每遍历到一个节点,就将 $prev$ 的右子节点指向它,然后将当前节点的左子节点置为空,再将当前节点赋值给 $prev$,以便于下一次遍历。
遍历结束后,原二叉搜索树被修改成只有右子节点的单链表,我们再将虚拟节点 $dummy$ 的右子节点返回即可。
时间复杂度 $O(n)$,空间复杂度 $O(n)$。其中 $n$ 为二叉搜索树的节点个数。
Python3 Java C++ Go TypeScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 # 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 :
def dfs ( root ):
if root is None :
return
nonlocal prev
dfs ( root . left )
prev . right = root
root . left = None
prev = root
dfs ( root . right )
dummy = prev = TreeNode ( right = root )
dfs ( root )
return dummy . right
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 /**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode() {}
* TreeNode(int val) { this.val = val; }
* TreeNode(int val, TreeNode left, TreeNode right) {
* this.val = val;
* this.left = left;
* this.right = right;
* }
* }
*/
class Solution {
private TreeNode prev ;
public TreeNode increasingBST ( TreeNode root ) {
TreeNode dummy = new TreeNode ( 0 , null , root );
prev = dummy ;
dfs ( root );
return dummy . right ;
}
private void dfs ( TreeNode root ) {
if ( root == null ) {
return ;
}
dfs ( root . left );
prev . right = root ;
root . left = null ;
prev = root ;
dfs ( root . right );
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 /**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public :
TreeNode * increasingBST ( TreeNode * root ) {
TreeNode * dummy = new TreeNode ( 0 , nullptr , root );
TreeNode * prev = dummy ;
function < void ( TreeNode * ) > dfs = [ & ]( TreeNode * root ) {
if ( ! root ) {
return ;
}
dfs ( root -> left );
prev -> right = root ;
root -> left = nullptr ;
prev = root ;
dfs ( root -> right );
};
dfs ( root );
return dummy -> right ;
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func increasingBST ( root * TreeNode ) * TreeNode {
dummy := & TreeNode { Val : 0 , Right : root }
prev := dummy
var dfs func ( root * TreeNode )
dfs = func ( root * TreeNode ) {
if root == nil {
return
}
dfs ( root . Left )
prev . Right = root
root . Left = nil
prev = root
dfs ( root . Right )
}
dfs ( root )
return dummy . Right
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 /**
* Definition for a binary tree node.
* class TreeNode {
* val: number
* left: TreeNode | null
* right: TreeNode | null
* constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
* }
*/
function increasingBST ( root : TreeNode | null ) : TreeNode | null {
const dummy = new TreeNode (( right = root ));
let prev = dummy ;
const dfs = ( root : TreeNode | null ) => {
if ( ! root ) {
return ;
}
dfs ( root . left );
prev . right = root ;
root . left = null ;
prev = root ;
dfs ( root . right );
};
dfs ( root );
return dummy . right ;
}
GitHub