二叉搜索树与双向列表
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中节点指针的指向
思路:
a> 二叉搜索树的中序遍历是一个不减的排序结果,因此先将二叉树搜索树中序遍历
b> 将遍历后的结果用相应的指针连接起来
代码:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
class Solution:
def Convert(self, pRootOfTree):
global li
li = []
self.mid_travel(pRootOfTree)
#没有节点
if not pRootOfTree:
return None
#只有一个节点
if len(li) == 1:
return pRootOfTree
# 多个节点
# 头结点
li[0].left = None
li[0].right = li[1]
# 尾节点
li[-1].left = li[-2]
li[-1].right = None
# 中间节点
for i in range(1,len(li)-1):
li[i].left = li[i - 1]
li[i].right = li[i + 1]
return li[0]
def mid_travel(self, root):
if not root:
return None
self.mid_travel(root.left)
li.append(root)
self.mid_travel(root.right)
if __name__ == '__main__':
s = Solution()
t12 = TreeNode(12)
t5 = TreeNode(5)
t18 = TreeNode(18)
t2 = TreeNode(2)
t9 = TreeNode(9)
t15 = TreeNode(15)
t19 = TreeNode(19)
t17 = TreeNode(17)
t16 = TreeNode(16)
# 开始创建树
t12.left = t5
t12.right = t18
t5.left = t2
t5.right = t9
t18.left = t15
t18.right = t19
t15.right = t17
t17.left = t16
# 调试方法
head = s.Convert(t12)
cur = head
while cur:
print(cur.val, end=' ')
cur = cur.right