题目描述
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
因为二叉搜索树是排序的,所以如果需要找出第k个节点只需要进行中序遍历就可以得到第k节点。不过中序遍历的结果就是排序的,所以实质上就是插入排序。可以利用一个集合,在遍历的过程中利用插入排序的算法就能得到第k个节点。下面是这种实现思路的实现代码(已被牛客AC):
public class Solution {
//采用非递归中序遍历的方式得到第k大的节点
TreeNode KthNode(TreeNode pRoot, int k) {
if(pRoot== null) return pRoot;
//创建一个变量指向第k大的节点
int p = 0;
//创建一个栈用于保存遍历的顺序
Stack<TreeNode> s = new Stack<TreeNode>();
TreeNode curNode = pRoot;
while(curNode != null || !s.isEmpty()){
while(curNode != null){
s.add(curNode);
curNode = curNode.left;
}
if(!s.isEmpty()){
curNode = s.pop();
p++;
if(p == k) return curNode;
curNode = curNode.right;
}
}
return null;
}
}
时间: 2024-12-11 12:10:30