13、二叉搜索树的后序遍历序列
解题思路:看评论明白的解题思路,学习~
采用分治法的思想,找到根结点、左子树的序列、右子树的序列,分别判断左右子序列是否为二叉树的后序序列。
二叉搜索树后序序列特征:最后一个值为root,左子树的值都比root小,右子树的值都比root大。
解题过程:
1、确定root
2、遍历序列(除去root后),找到第一个比root大的值的位置,该位置左边为左子树,右边为右子树
3、遍历右子树,如果有值小于root,返回False
4、分别判断左子树和右子树是否仍为二叉搜索树(递归1、2、3)
# -*- coding:utf-8 -*-
class Solution:
def VerifySquenceOfBST(self, sequence):
# write code here
length = len(sequence)
if length == 0:
return False
if length == 1:
return True
root = sequence[-1]
left = 0
while sequence[left] < root:
left += 1
for j in range(left,length - 1):
if sequence[j] < root:
return False
return self.VerifySquenceOfBST(sequence[:left]) or self.VerifySquenceOfBST(sequence[left:length - 1])
笔记:别的都可以看懂,就是最后递归时不明白为什么用 or 而不是and,后面再细细分析一下,加油
**
拓展 二叉树的先序遍历序列、二叉树的中序遍历序列
**
14、二叉树中和为某一值的路径
题目描述
输入一颗二叉树的跟节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意: 在返回值的list中,数组长度大的数组靠前)
解题:通过目前排第一的,采用递归,思路很清晰~
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回二维列表,内部每个列表表示找到的路径
def FindPath(self, root, expectNumber):
# write code here
if not root:
return []
if root and not root.left and not root.right and root.val == expectNumber :
return [[root.val]]
res = []
left = self.FindPath(root.left, expectNumber - root.val)
right = self.FindPath(root.right, expectNumber - root.val)
for i in left+right:
res.append([root.val] + i)
return res
14、复杂链表的复制
题目描述
输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空)
笔记:算法知识不足,看到题没有思路,目前对链表还是不太熟悉,先刷题争取拿到一个实习offer,后面一定补一补,不行听一听左神的课程试试~
# -*- 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 not pHead:
return pHead
p = RandomListNode(pHead.label)
p.next = pHead.next
p.random = pHead.random
p.next = self.Clone(pHead.next)
return p