二叉搜索树的第k个结点 - Java
题目描述
给定一棵二叉搜索树,请找出其中的第k小的TreeNode结点。
输入
{5,3,7,2,4,6,8},3
返回值
{4}
说明
按结点数值大小顺序第三小结点的值为4
思路
首先先了解二叉搜索树的定义,二叉搜索树又称二叉查找树,二叉排序树
它是一棵空树,或者是具有下列性质的二叉树:
(1)若左子树不空,则左子树上所有结点的值均小于它的根结点的值;
(2)若右子树不空,则右子树上所有结点的值均大于它的根结点的值;
(3)左、右子树也分别为二叉排序树;
(4)没有键值相等的结点。
我们可以得知,左节点是最小的,每次都要遍历左节点,当左节点为空时,再去查右节点。
如下:
{5,3,7,2,4,6,8}二叉树
5
/ \
3 7
/ \ / \
2 4 6 8
将5,3,2依次入栈,此时2的左节点为空,2出栈,计数器减1,2的右节点为空,3出栈,计数器减1,3的右节点不空入栈,左节点空,再出栈,计数器减1,4的右节点空,5出栈…依次下去,直到计数器为0。
实现Implementation
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot == null || k <= 0){
return null;
}
Stack<TreeNode> stack = new Stack<>(); //建立栈
TreeNode cur = pRoot;
//while 部分为中序遍历
while(!stack.isEmpty() || cur != null){
if(cur != null){
stack.push(cur); //将所有的左节点入栈,直到最左节点(最小值)
cur = cur.left;
}else{
cur = stack.pop();//当前节点null则弹出栈内元素,相当于按顺序输出最小值。
if(--k == 0){ //计数器功能
return cur;
}
cur = cur.right; // 左节点已经算了,到右节点
}
}
return null;
}