1.题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
2.算法描述
根据二叉搜索树的性质,
二
叉
搜
索
树
的
中
序
遍
历
是
从
小
到
大
排
序
的
。
\red{二叉搜索树的中序遍历是从小到大排序的。}
二叉搜索树的中序遍历是从小到大排序的。
所以用一个变量
c
n
t
cnt
cnt初始为0记录遍历结点的个数,每遍历一个结点
c
n
t
cnt
cnt自增1,当
c
n
t
cnt
cnt等于
k
k
k时,就返回所遍历的那个结点即可。
3.代码描述
3.1.Java代码
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.*;
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k){
if(pRoot == null) return null;
int cnt = 0;
Stack<TreeNode> s = new Stack<>();
TreeNode node = pRoot;
while(node!=null ||!s.isEmpty()){
while(node!=null){
s.push(node);
node = node.left;
}
if(!s.isEmpty()){
node = s.pop();
cnt++;//每弹出一个结点,就自增1
if(cnt == k)//检查是否弹出了k个结点
return node;
node = node.right;
}
}
return null;
}
}
3.2.Python代码
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回对应节点TreeNode
def KthNode(self, pRoot, k):
if pRoot==None:
return None
stack = []
cnt = 0
node = pRoot
while node or stack:
while node:
stack.append(node)
node = node.left
if stack:
cnt += 1
node = stack.pop()
if cnt==k:
return node
node = node.right
return None