《剑指offer》刷题——【面试中的各项能力】面试题54:二叉搜索树的第k大节点(java实现)
一、题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如,(5,3,7,2,4,6,8)中,按结点数值大小顺序第
三小结点的值为4。
二、题目分析
- 中序遍历二叉搜索树,{2,3,4,5,6,7,8},递增排序
- 中序遍历过程中,累加计算访问过的节点数目
- 当计数器等于要求的k 时,则返回该节点。
方法一:借助栈——非递归
import java.util.Stack;
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k)
{
//首先中序遍历这颗二叉树
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode p = pRoot;
int i = 0;
while(p != null || !stack.isEmpty()){
if(p != null){
stack.push(p);
p = p.left;
}else{
TreeNode node = stack.pop();
i++;
if(i == k){
return node;
}
p = node.right;
}
}
return null;
}
}
方法二:全局变量——递归
/*
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
public class Solution {
public int count = 0;
TreeNode KthNode(TreeNode pRoot, int k)
{
//当前节点为空,则返回null
if(pRoot != null){
TreeNode p = KthNode(pRoot.left,k);//返回的左节点
//左节点不为空
if(p != null)
//返回左节点
return p;
//记录已遍历节点
count++;
//若已遍历到要查找节点,则返回当前节点
if(count == k)
return pRoot;
TreeNode q = KthNode(pRoot.right,k);//返回右节点
//若右节点不为空,则返回右节点
if(q != null)
return q;
}
return null;
}
}