题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的循环双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。
为了让您更好地理解问题,以下面的二叉搜索树为例:
我们希望将这个二叉搜索树转化为双向循环链表。链表中的每个节点都有一个前驱和后继指针。对于双向循环链表,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。
下图展示了上面的二叉搜索树转化成的链表。“head” 表示指向链表中有最小元素的节点。
特别地,我们希望可以就地完成转换操作。当转化完成以后,树中节点的左指针需要指向前驱,树中节点的右指针需要指向后继。还需要返回链表中的第一个节点的指针。
本题实质上是要将结点的左右子树重新定向,首先将这个二叉排序树进行中序遍历,然后按照遍历顺序修改每个结点的左右子树。每个结点的左子树指向它的前一个结点,右子树指向它的后一个结点。
所以本题的做法就是先设置一个前驱结点,然后递归地中序遍历,然后在遍历过程中将当前结点的左子树指向前驱结点,让前驱结点的右子树指向当前结点。然后将当前结点更新为前驱结点。
本题还需要将首尾结点进行连接,而且中序遍历的第一个结点也没有前驱结点,所以这里要单独判断一下,将第一个结点保存为头结点,最后前驱结点会指向中序遍历的最后一个结点,然后将两个结点相连。代码如下:
class Solution(object):
def treeToDoublyList(self, root):
"""
:type root: Node
:rtype: Node
"""
def cur(root):
if not root:
return
cur(root.left)
if self.pre:
self.pre.right,root.left=root,self.pre
else:
self.head=root
self.pre=root
cur(root.right)
if not root:
return None
self.pre=None
cur(root)
self.head.left,self.pre.right=self.pre,self.head
return self.head
版权声明:本文为Q_M_X_D_D_原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。