题目
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
思路
这篇博客写得很好,https://blog.csdn.net/u010005281/article/details/79657259
总结
- 如果递归时需要新的参数传递(已有的函数定义的参数不够),有两种解决方法,
一是定义一个子函数,重新定义需要的参数,递归调用子函数;
二是定义全局变量,在class Solution里,def init(self): self.global = None。 - 定义两个辅助节点listHead(链表头节点)、listTail(链表尾节点)。listHead用于记录链表的头节点,用于最后算法的返回;listTail用于定位当前需要更改指向的节点。
- 中序遍历,先遍历左子树,访问根节点时,更改指针,加入双向链接,再遍历右子树。
代码
def __init__(self):
self.listHead = None
self.listTail = None
def Convert(self, pRootOfTree):
if pRootOfTree == None:
return pRootOfTree
self.Convert(pRootOfTree.left)
if self.listHead == None: # 未初始化,访问的第一个节点,最左(小)子节点
self.listHead = pRootOfTree
self.listTail = pRootOfTree
else:
self.listTail.right = pRootOfTree
pRootOfTree.left = self.listTail
self.listTail = pRootOfTree
self.Convert(pRootOfTree.right)
return self.listHead