# 二叉查找树转变为有序双向链表

比如将二元查找树
10
/    \
6       14
/  \     /　 \
4     8  12   16

4=6=8=10=12=14=16。

```import random
class Node(object):
def __init__(self,key):
self.key=key
self.left=None
self.right=None
class BSTree(object):
def __init__(self):
self.root=None
def put(self,key):
if not self.root:
self.root=Node(key)
else:
self.root=self._put(self.root,key)
def _put(self,node,key):
if node is None:
node=Node(key)
elif key<node.key:
node.left=self._put(node.left,key)
elif key>node.key:
node.right=self._put(node.right,key)
return node
def convert(self):
if self.root:
return self._convert(self.root)
def _convert(self,node,asright=True):
if not node:
return None
else:
left=self._convert(node.left,False)
if left:
left.right=node
node.left=left
right=self._convert(node.right)
if right:
right.left=node
node.right=right
cur=node
if asright:
while cur.left:
cur=cur.left
if not asright:
while cur.right:
cur=cur.right
return cur

if __name__=='__main__':
t=BSTree()
for i in range(10):
t.put(random.randint(0,100))
cur=t.convert()
if cur:
print cur.key
while cur.right:
cur=cur.right
print cur.key
while cur.left:
cur=cur.left
print cur.key```

另一种思路是采用中序遍历的方法。二叉查找树中序遍历的话就是从小到大排列。将遍历过的节点转为有序链表，然后将下一个要遍历的节点加到链表结尾。

```import random
class Node(object):
def __init__(self,key):
self.key=key
self.left=None
self.right=None
def __init__(self):
def travel(self):
while node:
print node.key
node=node.right
class BSTree(object):
def __init__(self):
self.root=None
self.curNode=None
def put(self,key):
if not self.root:
self.root=Node(key)
else:
self.root=self._put(self.root,key)
def _put(self,node,key):
if node is None:
node=Node(key)
elif key<node.key:
node.left=self._put(node.left,key)
elif key>node.key:
node.right=self._put(node.right,key)
return node
def convert(self):
self._travel(self.root)
return self.list
def _travel(self,node):
if node:
self._travel(node.left)
if self.curNode:
self.curNode.right=node
node.left=self.curNode
else:
self.curNode=node
self._travel(node.right)

if __name__=='__main__':
t=BSTree()
for i in range(100):
t.put(random.randint(0,100))
l=t.convert()
l.travel()
```

原文作者：再见紫罗兰
原文地址: https://www.cnblogs.com/linxiyue/p/3753852.html
本文转自网络文章，转载此文章仅为分享知识，如有侵权，请联系博主进行删除。