25、复杂链表的复制
理解下什么是深拷贝,什么是浅拷贝
递归:
# -*- coding:utf-8 -*-
# class RandomListNode:
# def __init__(self, x):
# self.label = x
# self.next = None
# self.random = None
class Solution:
# 返回 RandomListNode
def Clone(self, pHead):
# write code here
if pHead is None:
return
newNode = RandomListNode(pHead.label) # newNode存放各个节点
newNode.random = pHead.random # 存放各个节点指向random节点。没有为None
newNode.next = self.Clone(pHead.next) # 存放各个节点的值
return newNode
哈希表法:
class Solution:
def Clone(self, head):
nodeList = [] #存放各个节点
randomList = [] #存放各个节点指向的random节点。没有则为None
labelList = [] #存放各个节点的值
while head:
randomList.append(head.random)
nodeList.append(head)
labelList.append(head.label)
head = head.next
#random节点的索引,如果没有则为1
labelIndexList = map(lambda c: nodeList.index(c) if c else -1, randomList)
dummy = RandomListNode(0)
pre = dummy
#节点列表,只要把这些节点的random设置好,顺序串起来就ok了。
nodeList=map(lambda c:RandomListNode(c),labelList)
#把每个节点的random绑定好,根据对应的index来绑定
for i in range(len(nodeList)):
if labelIndexList[i]!=-1:
nodeList[i].random=nodeList[labelIndexList[i]]
for i in nodeList:
pre.next=i
pre=pre.next
return dummy.next
26、二叉搜索树与双向链表
补充:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值; 若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值; 它的左、右子树也分别为二叉排序树。
递归+数组
思路:
- 1、中序遍历一遍二叉搜索树,将节点保存在一个数组中。
- 2、遍历数组,更改每个节点的 left 和 right
- 3、返回数组第一个元素
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def Convert(self, pRootOfTree):
# write code here
if pRootOfTree is None:
return None
res = []
# 中序遍历
def helper(root):
if root is None:
return None
left = helper(root.left)
res.append(root)
right = helper(root.right)
# res.append(right)
helper(pRootOfTree)
for i in range(len(res)):
if i+1 == len(res):
break
res[i].right = res[i+1]
res[i+1].left = res[i]
return res[0]