题目输入一棵二元查找树,将该二元查找树换成一个排序的双向链表。
ps:::二元查找树是左子树存在则左子树所有节点都小于它的根节点。右子树若存在则右子树节点均大于他的根节点。
为了方便大家理解,我先回顾双向链表。
双向链表,包含数据,指向上一个节点的指针,指向以一个节点的指针
class Lnode():
def __init__(self):
self.data=None
self.next=None
self.prev=None
二叉树,包含根的数据,连接该节点的左子树,连接该节点的右子树
class BiTree():
def __init__(self):
self.data=None
self.lchild=None
self.rchild=None
两个思考点:
1,是不是突然感觉两者结构好像呀,self.lchild就是self.pre,self.rchild就是self.next。好好意会一下
2,它展开得到的链表就是二叉树中序遍历的结果。
class Bitree():
def __init__(self):
self.data=None
self.lchild=None
self.rchild=None
class Test():
def __init__(self):
self.ph=None#头指针呢
self.pe=None#尾指针呢
def arrtotree(self,arr,start,end):
root=None
if end>=start:
root=Bitree()
mid=int((start+end+1)/2)
root.data=arr[mid]
root.lchild=self.arrtotree(arr,start,mid-1)
root.rchild=self.arrtotree(arr,mid+1,end)
else:
root=None
return root
def inorderlink(self,root):
if root ==None:
return
self.inorderlink(root.lchild)
root.lchild=self.pe
if self.pe==None:#双向链表为空,当前节点为双向链表头节点
self.ph=root
else:
self.pe.rchild=root#使双向链表中最后一个节点的右孩子指向当前节点
self.pe=root
###转换root右子树
self.inorderlink(root.rchild)
if __name__=="__main__":
a=[1,2,3,4,5,6,7]
test=Test()
root=test.arrtotree(arr,0,len(a)-1)
test.inorderlink(root)
cur=test.ph
while cur!=None:
print(cur.data)
cur=cur.rchild