题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
解题思路
思路一:递归
//思路:二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。
// 所以,按照中序遍历顺序找到第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;
}
}思路二:非递归
import java.util.*;
public class Solution {
TreeNode KthNode(TreeNode root, int k) {
if(root == null || k == 0) return null;
int count = 0;
Stack<TreeNode> stack = new Stack<>();
while (root != null || ! stack.isEmpty()) {
while (root != null) {
stack.push(root);
root = root.left;
}
root = stack.pop();
count ++;
if(count == k) return root;
root = root.right;
}
return null;
}
}代码三:
/*
*中序遍历二叉搜索树后正好是从小到大的顺序,直接返回第k-1个即可
*/
import java.util.ArrayList;
public class Solution {
ArrayList<TreeNode> treenode=new ArrayList<TreeNode>();
TreeNode KthNode(TreeNode pRoot, int k) {
InOrder(pRoot);
if(treenode.size()<1||k<1||k>treenode.size())
return null;
return treenode.get(k-1);
}
public void InOrder(TreeNode node)
{
if(node!=null)
{
InOrder(node.left);
treenode.add(node);
InOrder(node.right);
}
}
}参考资料
https://www.nowcoder.com/questionTerminal/ef068f602dde4d28aab2b210e859150a?f=discussion



京公网安备 11010502036488号