美文网首页
9 - Medium - 每个节点的右向指针

9 - Medium - 每个节点的右向指针

作者: 1f872d1e3817 | 来源:发表于2018-06-22 17:00 被阅读0次

给定一个二叉树

struct TreeLinkNode {
  TreeLinkNode *left;
  TreeLinkNode *right;
  TreeLinkNode *next;
}

填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

说明:

你只能使用额外常数空间。
使用递归解题也符合要求,本题中递归程序占用的栈空间不算做额外的空间复杂度。
你可以假设它是一个完美二叉树(即所有叶子节点都在同一层,每个父节点都有两个子节点)。
示例:

给定完美二叉树,

     1
   /  \
  2    3
 / \  / \
4  5  6  7

调用你的函数后,该完美二叉树变为:

     1 -> NULL
   /  \
  2 -> 3 -> NULL
 / \  / \
4->5->6->7 -> NULL

利用层序遍历的结果,其中遍历结果列表中存储具体节点,且空节点也要存

# Definition for binary tree with next pointer.
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None

class Solution:
    def connect(self, root):
        if not root:
            return
        level = []
        self.dfs(root, 0, level)
        for i in range(len(level)):
            length = len(level[i])
            for j in range(length):
                if level[i][j]:
                    if j == length-1:
                        level[i][j].next = None
                    else:
                        level[i][j].next = level[i][j+1]

    def dfs(self, root, depth, res):
        if len(res) < depth+1:
            res.append([])
        if root == None:
            res[depth].append(None)
            return res
        res[depth].append(root)
        self.dfs(root.left, depth+1, res)
        self.dfs(root.right, depth+1, res)
# Definition for binary tree with next pointer.
# class TreeLinkNode:
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None
#         self.next = None

class Solution:
    # @param root, a tree link node
    # @return nothing
    def connect(self, root):
        if not root:
            return None
        root.next = None
        pre_next = root
        cur_next = root.left
        while root.left:
            cur_next.next = pre_next.right
            cur_next = cur_next.next
            while pre_next.next:
                cur_next.next = pre_next.next.left
                cur_next = cur_next.next
                cur_next.next = pre_next.next.right
                cur_next = cur_next.next
                pre_next = pre_next.next
            cur_next.next = None
            root = root.left
            pre_next = root
            cur_next = root.left

相关文章

  • 9 - Medium - 每个节点的右向指针

    给定一个二叉树 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 ne...

  • 每个节点的右向指针

    给定一个二叉树 struct TreeLinkNode {TreeLinkNode *left;TreeLinkN...

  • 每个节点的右向指针

    给定一个二叉树 填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 ne...

  • 数据结构与算法11——线索二叉树

    概念 链式存储二叉树的时,每个节点都有一个左子树节点指针和一个右子树指针。当某个结点没有左子树和右子树的节点时,把...

  • Binary Tree Upside Down

    medium Question 二叉树的右节点要么是拥有姊妹节点的叶节点,要么是空。将二叉树上下颠倒,原来的右节点...

  • Clone graph

    Medium, Msc Question 复制一个无向graph。graph的每个节点包含一个label和以个ne...

  • LeetCode-116-填充每个节点的下一个右侧节点指针

    LeetCode-116-填充每个节点的下一个右侧节点指针 116. 填充每个节点的下一个右侧节点指针[https...

  • 双线链表

    双向链表的特点:1、以节点为单位,每个节点有上个节点指针和下个节点指针2、至少包含头节点和尾节点3、添加节点时先改...

  • 链表-创建链表

    链表的每个节点分为指针域和数据域,创建链表的过程可以理解为将每个节点的指针域指向其他节点,最终形成一个链条,即链表...

  • 链表-单链表

    概念 n个节点离散分配 彼此通过指针相连 每个节点只有一个前驱节点,每个节点只有一个后续节点 首节点没有前驱节点,...

网友评论

      本文标题:9 - Medium - 每个节点的右向指针

      本文链接:https://www.haomeiwen.com/subject/hjzkyftx.html