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

给定一个二叉树

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 题量有点多,建议Ctrl + F题号或题目哦~ 二叉树的遍历(前序遍历,中序遍历,后序遍历)[144] Binar...
    野狗子嗷嗷嗷阅读 9,128评论 2 37
  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 5,925评论 0 13
  • 树的概述 树是一种非常常用的数据结构,树与前面介绍的线性表,栈,队列等线性结构不同,树是一种非线性结构 1.树的定...
    Jack921阅读 4,484评论 1 31
  • 我#41.Enyshou 延寿 #42.Evoke唤起 #43.Eye-wa艾哇 #44.Facade立面 #45...
    冉瑶琳阅读 534评论 0 1
  • 1.构造函数的介绍构造函数类似于OC中的初始化方法:init方法默认情况下载创建一个类时,必然会调用一个构造函数即...
    IIronMan阅读 326评论 0 0