【leetcode】116-117 填充每个节点的下一个右侧节点指针
程序员文章站
2022-05-20 16:14:29
...
116 填充每个节点的下一个右侧节点指针
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
思路
因为为完美二叉树,所以当左节点不为空时,右节点也不为空,root.left.next=root.right(示例的2,4,6节点)
当root有右侧节点,root.right.next=root.next.left(示例的5节点)
否则root.right.next=None(示例的1,3,7节点)
class Solution:
def connect(self, root):
# 不需要判断root.right是否为null
if root and root.left:
root.left.next = root.right
if root.next:
root.right.next = root.next.left
else:root.right.next = None
self.connect(root.left)
self.connect(root.right)
return root
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL
。
初始状态下,所有 next 指针都被设置为 NULL
。
我真的晕了,看不出这两道题的任何区别。。。可能不是完美二叉树???所以要加入对“右节点空与不空的判断”???
dfs,深搜,和上一题的区别是这不是完全二叉树了,所以要注意几个点:
- 可能有右子树,但没有左子树;
- 要用node->next指向堂兄弟时,可能堂兄弟不是左子结点,而可能是右子结点 (5-->7);
- 需要先找到右边的堂兄弟结点,所以注意两点:
- 先遍历右子树;
- 右边堂兄弟可能不存在。。。
# 运行没通过,也没看????
def connect(self, node):
tail = dummy = TreeLinkNode(0)
while node:
tail.next = node.left
if tail.next:
tail = tail.next
tail.next = node.right
if tail.next:
tail = tail.next
node = node.next
if not node:
tail = dummy
node = dummy.next
def connect(self, root: 'Node') -> 'Node':
if root == None or (root.left == None and root.right == None):
return root
que = [root]
while que:
s = len(que)
for i in range(s):
temp = que.pop(0)
if i+1 < s:
# 节点的next是当前对列的第一个,说明是右堂兄弟
temp.next = que[0]
else:
# 根节点的next是none
temp.next = None
if temp.left != None:
que.append(temp.left)
if temp.right != None:
que.append(temp.right)
return root
比较好理解,但是最后一句没有看懂。。。
class Solution(object):
def connect(self, root):
if not root:
return
if root.left and root.right:
root.left.next =root.right
elif root.left:
#if do not have root.left, find root.next.left
root.left.next = self.findnext(root.next)
if root.right:
#always find root.next.left
root.right.next = self.findnext(root.next)
self.connect(root.right)
self.connect(root.left)
return root
def findnext(self, curr):
if not curr: return
elif curr.left:
return curr.left
elif curr.right:
return curr.right
return self.findnext(curr.next) # ???? 意思是上面的条件都没符合,然后返回的是个空none。
参考:
推荐阅读
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
剑指offer25:复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),结果返回复制后复杂链表的head。
-
C++实现LeetCode(117.每个节点的右向指针之二)
-
填充每个节点的下一个右侧节点指针 II
-
117. 填充每个节点的下一个右侧节点指针 II
-
【C语言 LeetCode 116】填充每个节点的下一个右侧节点指针
-
leetcode116. 填充每个节点的下一个右侧节点指针
-
leetcode117. 填充每个节点的下一个右侧节点指针 II
-
leetcode116. 填充每个节点的下一个右侧节点指针/层次遍历
-
leetcode116. 填充每个节点的下一个右侧节点指针