【刷题日记】树的那些事儿(四)——二叉搜索树BST

树的那些事儿(一)——基础操作
树的那些事儿(二)——简单递归
树的那些事儿(二)——重建一棵树

题目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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值