题目:给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
牛客网:链接
这棵树是二叉搜索树,首先想到的是二叉搜索树的一个特点:左子结点的值 < 根结点的值 < 右子结点的值。给定一颗二叉搜索树,按照中序遍历的顺序,获得其第k大的节点。基于以上信息开始求解,会发现这几乎就是一道中序遍历的题,不同之处仅仅在于:中序遍历返回二叉树中序遍历后所有节点的值的列表,而这道题返回中序遍历过程中填入列表的第k个节点。我们当然可以先对平衡二叉树进行中序遍历,在返回的列表中找到第k个节点;但很显然还有更直接的方式,即中序遍历到需要的位置后立即返回,而不需要遍历完整棵二叉树。
本题需要三步:
1. 递归左子树,并判断有无返回节点。如果有,停止递归,返回所要返回的节点。
2. 当左子树没有返回节点时,判断当前的根节点是不是第k个遍历到的值(即第k大)。如果是,则返回该节点,停止递归。
3. 当左子树和根节点都没有返回节点时,递归右子树,并判断有无返回节点。如果有,停止递归,返回所要返回的节点。
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回对应节点TreeNode
count = 0
def KthNode(self, pRoot, k):
if not pRoot:
return None
node = self.KthNode(pRoot.left, k)
if node:
return node
self.count += 1
if self.count == k:
return pRoot
node = self.KthNode(pRoot.right, k)
if node:
return node