- Notifications
You must be signed in to change notification settings - Fork 13
/
Copy path117-populating-next-right-pointers-in-each-node-ii.py
109 lines (89 loc) · 3.1 KB
/
117-populating-next-right-pointers-in-each-node-ii.py
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
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
"""
Problem Link: https://leetcode.com/problems/populating-next-right-pointers-in-each-node-ii/
Given a binary tree
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be
set to NULL.
Initially, all next pointers are set to NULL.
Follow up:
You may only use constant extra space.
Recursive approach is fine, you may assume implicit stack space does not count as extra space for this problem.
Example 1:
Input: root = [1,2,3,4,5,null,7]
Output: [1,#,2,3,#,4,5,7,#]
Explanation: Given the above binary tree (Figure A), your function should populate each next pointer to point to its
next right node, just like in Figure B. The serialized output is in level order as connected by the next pointers,
with '#' signifying the end of each level.
Constraints:
The number of nodes in the given tree is less than 6000.
-100 <= node.val <= 100
"""
"""
# Definition for a Node.
class Node:
def __init__(self, val: int = 0, left: 'Node' = None, right: 'Node' = None, next: 'Node' = None):
self.val = val
self.left = left
self.right = right
self.next = next
"""
classSolution:
defconnect(self, root: 'Node') ->'Node':
ifnotroot:
return
self.dfs(root)
returnroot
defdfs(self, root, parent=None):
ifnotroot:
return
cur1=cur2=None
whileparent:
ifnotparent.leftandnotparent.right:
parent=parent.next
continue
ifnotcur1:
cur1=parent.leftorparent.right
ifcur1==parent.right:
parent=parent.next
elifnotcur2:
ifcur1==parent.rightorcur1==parent.leftandnotparent.right:
parent=parent.next
continue
ifcur1==parent.left:
cur2=parent.right
else:
cur2=parent.leftorparent.right
else:
cur1.next=cur2
cur1, cur2=cur2, None
self.dfs(root.left, root)
self.dfs(root.right, root)
classSolution1:
defconnect(self, root: 'Node') ->'Node':
ifnotroot:
return
self.dfs(root)
returnroot
defdfs(self, root, next_node=None):
ifnotroot:
return
root.next=next_node
n1=root.right
n2=root.next.leftifroot.nextelseNone
n3=root.next.rightifroot.nextelseNone
next_node=n1orn2orn3
ifroot.left:
self.dfs(root.left, next_node)
ifroot.right:
ifnext_node==n1:
next_node=n2orn3
elifnext_node==n2:
next_node=n3
else:
next_node=None
self.dfs(root.right, next_node)