lintcode 378 将二叉查找树转换成双链表 python

每天坚持刷题!!

题目要求
将一个二叉查找树按照中序遍历转换成双向链表。

题目分析

  1. 简单的思路是先用数组或是队列存储二叉查找树的中序遍历结果,然后从头到尾遍历生成双向链表,需要O(n)的时间和额外O(n)的空间,因为我们需要对二叉查找树的每一个节点生成对应的双向链表,所以时间复杂度不太可能下降,可以针对空间进行优化。

  2. 优化的思路是在进行二叉查找树中序遍历时就生成对应的双向链表的节点,那么因为是进行中序遍历,所以双向链表的起点要么是根节点左子树的最小值,要么是根节点(在根节点没有左子树的时候);其次稍加分析我们可以知道对于节点的左子树递归时返回左子树的中序遍历的最后一个节点,对于节点的右子树返回中序遍历的第一个节点,以此我们可以用递归的方式解决问题

def bstToDoublyList(self, root):
        # write your code here
        if not root:
            return
        if root.left is None and root.right is None:
            return DoublyListNode(root.val)
        head = [None]
        def recur_build_double_list(root, type='all'):
            if root is None:
                return 
            if root.left is None and root.right is None:
                temp = DoublyListNode(root.val)
                if head[0] is None:
                    head[0] = temp
                return temp
            temp_node = DoublyListNode(root.val)
            temp_node.prev = recur_build_double_list(root.left, type='left')
            if temp_node.prev:
                temp_node.prev.next = temp_node
            if not temp_node.prev:  # 防止左子树为空
                if head[0] is None:
                    head[0] = temp_node
            temp_node.next = recur_build_double_list(root.right, type='right')
            if temp_node.next:
                temp_node.next.prev = temp_node
            if type == 'left':
                while temp_node.next:
                    temp_node = temp_node.next
            elif type == 'right':
                while temp_node.prev:
                    temp_node = temp_node.prev
            return temp_node
        recur_build_double_list(root)
        return head[0]
    原文作者:二叉查找树
    原文地址: https://blog.csdn.net/zy0707ok/article/details/81516224
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞