题目描述
输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。
分析思路:
题目描述如下图所示:
(容器法)首先看到下图的数字排序,明显就是一个中序遍历的结果,那么只需要对二叉搜索树做中序遍历,将遍历结果的每个节点保存进一个容器中,然后对容器中的每一个值,也就是二叉树的每一个节点按照规则重新链接好
链接规则如下:
从左往右,当前节点的右节点是当前在容器中的位置的下一位
从右往左,当前节点的做节点是当前在容器中的位置的前一位
示意图:
def Convert(root):
if not root:
return None
# 第一步使用中序遍历,保存节点
def MidOrder(root):
if not root:
return
MidOrder(root.left)
orderNode.append(root)
MidOrder(root.right)
orderNode = []
MidOrder(root)
# 重新构造链接
cur = orderNode[0]
Length = len(orderNode)
for i in range(Length - 1):
# 从左到右构造链接
orderNode[i].right = orderNode[i + 1]
# 从右往左构造链接
orderNode[Length - 1 - i].left = orderNode[Length - i - 2]
return cur
测试:
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
root = TreeNode(10)
a = TreeNode(6)
b = TreeNode(14)
c = TreeNode(4)
d = TreeNode(8)
e = TreeNode(12)
f = TreeNode(16)
root.left = a
root.right = b
a.left = c
a.right = d
b.left = e
b.right = f
Node = Convert(root)
tmp = Node
while tmp:
print(tmp.val)
tmp = tmp.right