剑指offer 36. 二叉搜索树与双向链表/leetcode 426. 将二叉搜索树转化为排序的双向链表 python实现

描述
将一个二叉搜索树就地转化为一个已排序的双向循环链表。可以将左右孩子指针作为双向循环链表的前驱和后继指针。

我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。

下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
思路
利用中序遍历 非递归来实现
注意记录上一个node即可

由于leetcode上 这个题不支持go 因此用的python写的
实现
"""
# Definition for a Node.
class Node:
    def __init__(self, val, left=None, right=None):
        self.val = val
        self.left = left
        self.right = right
"""
class Solution:
    def treeToDoublyList(self, root: 'Node') -> 'Node':
        if root == None:
            return None
        stack = []          # 利用list实现栈的功能
        cur = root
        new_head = None     # 新的链表的头
        last_node = None    # 遍历节点时 它的上一个节点
        top = None          # 遍历的节点及stack 栈的栈顶元素

        while cur != None or len(stack) != 0:
            while cur != None:
                stack.append(cur)
                cur = cur.left
                
            # top即为当前需要处理的节点
            top = stack[-1]
            # 出栈
            stack = stack[:-1]
            
            cur = top.right
            
            # 当前节点的上一个节点
            top.left = last_node
            # 如果上一个节点为空 说明为新链表的头节点
            if last_node != None:
                last_node.right = top
            else:
                new_head = top
            last_node = top
        
        # 最后将头和尾链接起来
        new_head.left = top
        top.right = new_head

        return new_head

你可能感兴趣的:(算法,数据结构,python)