二叉搜索树作为一种特殊二叉树结构,在面试中出现的频次不可谓不高。
本文通过对leetcode上的8道二叉搜索树题进行整理,让你对二叉搜索树的掌握更进一步~
首先,什么是二叉搜索树?
从严谨的数学定义上说,二叉搜索树是这样的:
二叉搜索树要么是空树,要么是具有下列性质的二叉树:
- 节点的左子树只包含小于当前节点的数。
- 节点的右子树只包含大于当前节点的数。
- 所有左子树和右子树自身必须也是二叉搜索树。
定义当然是对一个概念的最好描述,但是,当做题的时候,我们更应该注意二叉搜索树的两个特性。
- 二叉搜索树的中序遍历为一个递增序列
- 二叉搜索树的子树也是一个二叉搜索树
牢记这两个特性,遇到二叉搜索树的题目就不怕不怕啦~
废话不多说,直接操练起来!
.
二叉搜索树的第K大节点
这是一道剑指offer上的简单题
看到第K大,自然而然想到可以利用特性:中序遍历为递增序列。
但是这只是一个baseline,进阶地,我们可以想想怎么优化:
- 中序遍历为递增的,对求第K小很方便。但若求第K大,需要遍历完整棵树。
- 题目只要求求第k大而不是整个序列,可否在遍历到第k大的节点时提前返回?
转念一想,中序遍历之所以是递增序列,是因为它的遍历方式为:左->根->右
那么,如果把遍历方式改为右->根->左,是否就是递减序列了呢?
而且,我们还可以加入一个指示变量k_node,记录遍历到节点的个数,从而实现优化2。
代码如下:
# Definition for a binary tree node.
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
def kthLargest(self, root: TreeNode, k: int) -> int:
stack