栈
树
深度优先搜索
链表
二叉树
题目描述
给你二叉树的根结点 root
,请你将它展开为一个单链表:
展开后的单链表应该同样使用 TreeNode
,其中 right
子指针指向链表中下一个结点,而左子指针始终为 null
。
展开后的单链表应该与二叉树 先序遍历 顺序相同。
示例 1:
输入: root = [1,2,5,3,4,null,6]
输出: [1,null,2,null,3,null,4,null,5,null,6]
示例 2:
输入: root = []
输出: []
示例 3:
输入: root = [0]
输出: [0]
提示:
树中结点数在范围 [0, 2000]
内
-100 <= Node.val <= 100
进阶: 你可以使用原地算法(O(1)
额外空间)展开这棵树吗?
解法
方法一:寻找前驱节点
先序遍历的访问顺序是“根、左子树、右子树”,左子树最后一个节点访问完后,接着会访问根节点的右子树节点。
因此,对于当前节点,如果其左子节点不为空,我们找到左子树的最右节点,作为前驱节点,然后将当前节点的右子节点赋给前驱节点的右子节点。然后将当前节点的左子节点赋给当前节点的右子节点,并将当前节点的左子节点置为空。然后将当前节点的右子节点作为下一个节点,继续处理,直至所有节点处理完毕。
时间复杂度 $O(n)$,其中 $n$ 是树中节点的个数。空间复杂度 $O(1)$。
Python3 Java C++ Go TypeScript Rust JavaScript
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 # 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 flatten ( self , root : Optional [ TreeNode ]) -> None :
"""
Do not return anything, modify root in-place instead.
"""
while root :
if root . left :
pre = root . left
while pre . right :
pre = pre . right
pre . right = root . right
root . right = root . left
root . left = None
root = 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
31
32
33
34
35
36 /**
* 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 {
public void flatten ( TreeNode root ) {
while ( root != null ) {
if ( root . left != null ) {
// 找到当前节点左子树的最右节点
TreeNode pre = root . left ;
while ( pre . right != null ) {
pre = pre . right ;
}
// 将左子树的最右节点指向原来的右子树
pre . right = root . right ;
// 将当前节点指向左子树
root . right = root . left ;
root . left = null ;
}
root = 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 /**
* 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 :
void flatten ( TreeNode * root ) {
while ( root ) {
if ( root -> left ) {
TreeNode * pre = root -> left ;
while ( pre -> right ) {
pre = pre -> right ;
}
pre -> right = root -> right ;
root -> right = root -> left ;
root -> left = nullptr ;
}
root = root -> right ;
}
}
};
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 /**
* Definition for a binary tree node.
* type TreeNode struct {
* Val int
* Left *TreeNode
* Right *TreeNode
* }
*/
func flatten ( root * TreeNode ) {
for root != nil {
if root . Left != nil {
pre := root . Left
for pre . Right != nil {
pre = pre . Right
}
pre . Right = root . Right
root . Right = root . Left
root . Left = nil
}
root = 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
31 /**
* 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)
* }
* }
*/
/**
Do not return anything, modify root in-place instead.
*/
function flatten ( root : TreeNode | null ) : void {
while ( root !== null ) {
if ( root . left !== null ) {
let pre = root . left ;
while ( pre . right !== null ) {
pre = pre . right ;
}
pre . right = root . right ;
root . right = root . left ;
root . left = null ;
}
root = 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52 // Definition for a binary tree node.
// #[derive(Debug, PartialEq, Eq)]
// pub struct TreeNode {
// pub val: i32,
// pub left: Option<Rc<RefCell<TreeNode>>>,
// pub right: Option<Rc<RefCell<TreeNode>>>,
// }
//
// impl TreeNode {
// #[inline]
// pub fn new(val: i32) -> Self {
// TreeNode {
// val,
// left: None,
// right: None
// }
// }
// }
use std :: cell :: RefCell ;
use std :: rc :: Rc ;
impl Solution {
#[allow(dead_code)]
pub fn flatten ( root : & mut Option < Rc < RefCell < TreeNode >>> ) {
if root . is_none () {
return ;
}
let mut v : Vec < Option < Rc < RefCell < TreeNode >>>> = Vec :: new ();
// Initialize the vector
Self :: pre_order_traverse ( & mut v , root );
// Traverse the vector
let n = v . len ();
for i in 0 .. n - 1 {
v [ i ]. as_ref (). unwrap (). borrow_mut (). left = None ;
v [ i ]. as_ref (). unwrap (). borrow_mut (). right = v [ i + 1 ]. clone ();
}
}
#[allow(dead_code)]
fn pre_order_traverse (
v : & mut Vec < Option < Rc < RefCell < TreeNode >>>> ,
root : & Option < Rc < RefCell < TreeNode >>> ,
) {
if root . is_none () {
return ;
}
v . push ( root . clone ());
let left = root . as_ref (). unwrap (). borrow (). left . clone ();
let right = root . as_ref (). unwrap (). borrow (). right . clone ();
Self :: pre_order_traverse ( v , & left );
Self :: pre_order_traverse ( v , & 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 /**
* Definition for a binary tree node.
* function TreeNode(val, left, right) {
* this.val = (val===undefined ? 0 : val)
* this.left = (left===undefined ? null : left)
* this.right = (right===undefined ? null : right)
* }
*/
/**
* @param {TreeNode} root
* @return {void} Do not return anything, modify root in-place instead.
*/
var flatten = function ( root ) {
while ( root ) {
if ( root . left ) {
let pre = root . left ;
while ( pre . right ) {
pre = pre . right ;
}
pre . right = root . right ;
root . right = root . left ;
root . left = null ;
}
root = root . right ;
}
};
方法二