链表:
用Python语言实现一个单链表
#创建节点
class ListNode:
def __init__(self, data, next=None):
self.data = data
self.next = next
#创建同节点
head = ListNode(1)
p = head
for i in range(2, 11):
#创建新的节点
p.next = ListNode(i)
p = p.next
#p重新指向表头 遍历所有的结点输出元素
p = head
while p is not None:
print(p.data)
p = p.next
单链表的操作实现:
https://blog.csdn.net/weixin_41447267/article/details/93968762
1.往链表的末尾添加一个节点
2.在链表中找到第一个含有某值的节点并删除该节点。
面试6:从尾到头打印链表
题目:输入一个链表的头节点,从尾到头反过来打印出每个节点的值。
思路:遍历的顺序是从头到尾,输出的顺序是从尾到头。也就是第一个遍历的节点最后一个输出,最后一个遍历的节点,第一个输出。这既是典型的后进先出。可以用栈来实现。递归的本质就是栈结构,很自然想到可以用递归来实现。
class Solution:
def printListFromTailToHead(self, listNode):
if not listNode:
return []
p = listNode
stack = []
res = []
while p:
stack.append(p.val)
p = p.next
for i in range(len(stack)-1,-1,-1):
res.append(stack[i])
return res
树
面试题7.重建二叉树
输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。
class Solution:
# 返回构造的TreeNode根节点
def reConstructBinaryTree(self, pre, tin):
if not pre:
return None
root = TreeNode(pre[0])
n = tin.index(root.val) #找到根节点在中序遍历中的下标
root.left = self.reConstructBinaryTree(pre[1:n+1],tin[:n])
root.right = self.reConstructBinaryTree(pre[n+1:],tin[n+1:])
return root
面试题8:二叉树的下一个节点
给定一颗二叉树和其中一个节点,如何找出中序遍历序列的下一个节点?树中的节点除了有两个分别指向左,右子节点的指针,还有一个指向父节点的指针。
如果一个节点有右子树,那么它的下一个节点就是它的右子树的最左子节点。
没有右子树的情形,如果节点是它父节点左子树,那么它的下一个节点就是它的父节点
如果既没有右子树,并且还是它父节点的右子节点,就可以沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,如果这样的节点存在那么这个节点的父节点就是我们要找的下一个节点。
# -*- coding:utf-8 -*-
# class TreeLinkNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
# self.next = None
class Solution:
def GetNext(self, pNode):
if not pNode: return None
if pNode.right:
pNode = pNode.right
while pNode.left:
pNode = pNode.left
return pNode
else:
while pNode.next:
if pNode == pNode.next.left:
return pNode.next
pNode = pNode.next
return None