【题目描述】给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
【解题思路1】
//1. 二叉搜素树的中序遍历访问队列,自然的满足升序排序的条件。
//2. 中序遍历二叉搜索树,暂存输出队列。
//3. 从保存的输出队列中找到满足条件的值。
import java.util.ArrayList;
public class Solution {
ArrayList<TreeNode> arr = new ArrayList<TreeNode>();
TreeNode KthNode(TreeNode pRoot, int k)
{
if(pRoot==null|| k==0){
return null;
}
inOrder(pRoot);
TreeNode tr = pRoot;
if(k<=arr.size()){
tr = arr.get(k-1);
}else{
return null;
}
return tr;
}
public void inOrder(TreeNode root){
if(root ==null){
return;
}
if(root.left != null){
inOrder(root.left);
}
arr.add(root);
if(root.right != null){
inOrder(root.right);
}
}
}
【解题思路2】
//1. 改进思路1,不再暂存所有输出。
//2. 改为设置一个计数器。中序遍历过程中,累加计算访问过的节点数目,当计数器等于要求的k时,则返回该节点。
public class Solution {
int index = 0; //计数器
TreeNode KthNode(TreeNode root, int k)
{
if(root != null){ //中序遍历寻找第k个
TreeNode node = KthNode(root.left,k);
if(node != null)
return node;
index ++;
if(index == k)
return root;
node = KthNode(root.right,k);
if(node != null)
return node;
}
return null;
}
}
【解题思路3】
//1. 中序遍历非递归
import java.util.Stack;
public class Solution {
int count = 0;
TreeNode KthNode(TreeNode pRoot, int k)
{
if(count > k || pRoot == null)
return null;
TreeNode p = pRoot;
Stack<TreeNode> LDRStack = new Stack<TreeNode>();
TreeNode kthNode = null;
while(p != null || !LDRStack.isEmpty()){
while(p != null){
LDRStack.push(p);
p = p.left;
}
TreeNode node = LDRStack.pop();
System.out.print(node.val+",");
count++;
if(count == k){
kthNode = node;
break;
}
p = node.right;
}
return kthNode;
}
}