lintcode 453 将二叉树拆成链表

前言:一些有意思的题目我会单独拎出来一篇文章来写,其余的都放在集合篇里,毕竟题目太多了,每一题都来一篇太烦了

453. 将二叉树拆成链表

将一棵二叉树按照前序遍历拆解成为一个假链表。所谓的假链表是说,用二叉树的 right 指针,来表示链表中的 next 指针。

样例

              1
               \
     1          2
    / \          \
   2   5    =>    3
  / \   \          \
 3   4   6          4
                     \
                      5
                       \
                        6

挑战

不使用额外的空间耗费。

注意事项

不要忘记将左儿子标记为 null,否则你可能会得到空间溢出或是时间溢出。

以上就是题目,我们先来看看要求我们做什么

一个叉树,把左孩子换成右孩子,同一父节点的右孩子成为原先左孩子的右孩子,变成类似链表的形式。

是不是很懵逼,闲的没事做了这么玩,不过能玩出新花样也是个本事,我们就来试试看怎么做出来

其实这题的难点在于怎么保存原先的右孩子,这个我想了很久,看了看以前做过的题目有点了启发。

根据1-2-3-4-5-6这样的顺序,不难发现这是一个前序遍历,前序遍历的顺序是父---左---右

只要用1个变量保存右孩子,然后把左孩子接到右边,再把原来的右孩子放到现在的右孩子下边就行了

def flatten(self, root):
    p=root.right
    root.right=root.left
    root.left=None
    root.right.right=p

这是一个最基本的节点操作,问题是怎么扩大化呢?

从整体入手,根节点有左右子树,根据前序遍历的顺序,左子树的前序遍历的最后一个点后面接着的就是根节点的右子树

if root is None:
            return None
        # 左子树尾结点
        lt = self.flatten(root.left)
        # 右子树尾结点
        lr = self.flatten(root.right)
        if lt:
            lt.right = root.right
            root.right = root.left
        root.left = None

处理完一个小的三节点子树后,返回这个子树的尾节点就行了,左右2个尾节点都是空的话就证明是叶子结点,返回root

完整代码如下

"""
Definition of TreeNode:
class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left, self.right = None, None
"""

class Solution:
    # @param root: a TreeNode, the root of the binary tree
    # @return: nothing
    def flatten(self, root):
        # write your code here
        if root is None:
            return None
        # 左子树尾结点
        lt = self.flatten(root.left)
        # 右子树尾结点
        lr = self.flatten(root.right)
        if lt:
            lt.right = root.right
            root.right = root.left
        root.left = None
        if lr :
            return lr
        elif lt:
            return lt
        return root

这样的题目还是非常考验基本功的,非常有意思的一道题目,比什么翻转二叉树之类好玩很多

猜你喜欢

转载自blog.csdn.net/wzngzaixiaomantou/article/details/81395242