-
-
Notifications
You must be signed in to change notification settings - Fork 97
/
flatten-binary-tree-to-linked-list.js
52 lines (51 loc) · 1.86 KB
/
flatten-binary-tree-to-linked-list.js
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.
* 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) {
if (!root) return null
let pre = null
dfs(root)
function dfs(node) {
if (!node) return
dfs(node.right)
dfs(node.left)
node.right = pre // 当前节点的右指针 指向上一个节点 上一个节点就是后续遍历 最后一个值 6 5 4 3 2 1
node.left = null // 左指针清空
pre = node // 缓存节点
}
return pre // 最后pre是root节点 也就是head
}
// 栈:思路:将左子树接到右子树上 将右子树接到左子树后面
// var flatten = function (root) {
// while (root) {
// if (!root.left) {
// // 左子树没值 循环下一个右节点
// root = root.right
// } else {
// // 找左子树的最右边的节点 也就是最大的节点
// let pre = root.left
// while (pre.right) {
// pre = pre.right
// }
// pre.right = root.right
// // 将左子树插入到右子树的地方
// root.right = root.left
// root.left = null
// // 遍历下一个节点 下一个节点的左子树还没插入到右子树。
// root = root.right
// }
// }
// return root
// }