面试题36:二叉搜索树与双向链表
题目:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点指针的指向。比如,输入图中左边的二叉搜索树,则输出转换之后的排序双向链表。
思路
将指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为链表中指向后一个节点的指针。
中序遍历树中的每个节点。
https://blog.csdn.net/u010005281/article/details/79657259
class Solution:
def __init__(self):
self.listHead = None
self.listTail = None
def Convert(self, pRootOfTree):
if pRootOfTree==None:
return
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
class Solution:
def __init__(self):
self.array = []
def midOrder(self, root):
if not root:
return self.array
self.midOrder(root.left)
self.array.append(root.val)
self.midOrder(root.right)
class Solution:
def __init__(self):
self.listHead = None
self.listTail = None
# 将二叉树转换为有序双向链表
def Convert(self, pRootOfTree):
if pRootOfTree==None:
return
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
# 获得链表的正向序和反向序
def printList(self, head):
while head.right:
print(head.val, end=" ")
head = head.right
print(head.val)
while head:
print(head.val, end= " ")
head = head.left
# 给定二叉树的前序遍历和中序遍历,获得该二叉树
def getBSTwithPreTin(self, pre, tin):
if len(pre)==0 | len(tin)==0:
return None
root = TreeNode(pre[0])
for order,item in enumerate(tin):
if root .val == item:
root.left = self.getBSTwithPreTin(pre[1:order+1], tin[:order])
root.right = self.getBSTwithPreTin(pre[order+1:], tin[order+1:])
return root
class TreeNode:
def __init__(self, x):
self.left = None
self.right = None
self.val = x
if __name__ == '__main__':
solution = Solution()
preorder_seq = [4,2,1,3,6,5,7]
middleorder_seq = [1,2,3,4,5,6,7]
treeRoot1 = solution.getBSTwithPreTin(preorder_seq, middleorder_seq)
head = solution.Convert(treeRoot1)
solution.printList(head)
# 4
# / \
# 2 6
# / \ / \
# 1 3 5 7
面试题37:序列化二叉树
请实现两个函数,分别用来序列化和反序列化二叉树。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Serialize(self, root):
# write code here
if not root:
return "$"
return str(root.val)+","+self.Serialize(root.left)+","+self.Serialize(root.right)
def Deserialize(self, s):
# write code here
root, index = self.deserialize(s.split(","), 0)
return root
def deserialize(self, s, index):
if s[index] == "$":
return None, index+1
root = TreeNode(int(s[index]))
index+=1
root.left, index = self.deserialize(s, index)
root.right, index = self.deserialize(s, index)
return root,index