树的那些事儿(一)——基础操作
树的那些事儿(二)——简单递归
树的那些事儿(二)——重建一棵树
题目1: 返回一棵二叉搜索树的第k小结点
考察点:
- 二叉搜索树的特点:左子树≤根结点≤右子树(左-根-右顺序)
- 如何按照二叉搜索树的排序进行遍历:中序遍历
返回树的中序遍历的第k个结点即可。直接上代码,不知道中序遍历怎么写的请参阅树的那些事儿——基本操作
注意一下边界
可见啊,树的基本操作真的太太太太重要了啊!
def KthNode(self,root,k):
if k==0 or not root:
return None
stack = []
count = 0
while stack or root:
while root:
stack.append(root)
root = root.left
if stack:
root = stack.pop()
count+=1
if count ==k:
return root
root = root.right
return None
题目2:二叉搜索树的后序遍历序列
输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。
这个问题是要检查后序遍历序列的合法性。
怎么检查呢。
BST的特点是左子树<根结点<右子树
后序遍历序列的顺序是: 左子树 – 右子树 --根
- 序列的最后一位数是根
- 假设合法:从左往右遍历,小于根节点的部分是左子树,后面是右子树
- 检查右子树合法性: 遍历右子树序列,如果存在某个值小于根,则不合法
- 递归检查左右子树的序列
def VerifySequenceOfBST(sequence):
# 递归终止条件
# (1)空序列 不是
if len(sequence)==0:
return False
#(2)单元素序列 是
if len(sequence)==1:
return True
# 递归检查合法性:
# 1. 划分子树
for index in range(len(sequence)-1):
if sequence[index] > sequence[-1]:
break # 此时index即右子树起点
left = sequence[:index]
right = sequence[index:-2]
# 如果左右子树长度为0,为True
leftIsTree, rightIsTree = True, True
# 检查长度不为0 的序列合法性
if len(left):
leftIsTree = VerifySequenceOfBST(left)
if len(right):
rightIsTree = VerifySequenceOfBST(right)
# 两个序列的合法性决定整个序列是不是合法
return leftIsTree and rightIsTree