题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
方法:二叉搜索树按照中序遍历的顺序打印出来正好就是排序好的顺序。所以,按照中序遍历顺序找到第k个结点就是结果。
方法一:常用递归版:
import java.util.*;
/*
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){
//边界条件
if (pRoot == null || k <= 0) {
return null;
}
ArrayList<TreeNode> list = new ArrayList<>();
midSearch(pRoot, list);
if (k > list.size()) {
return null;
}
return list.get(k - 1);
}
void midSearch(TreeNode root, ArrayList<TreeNode> list) {
if (root == null) {
return;
}
midSearch(root.left, list);
list.add(root);
midSearch(root.right, list);
/* 这样也行
if (root != null) {
midSearch(root.left, list);
list.add(root);
midSearch(root.right, list);
}
*/
}
}
方法二:非递归版
package test;
import java.util.Stack;
class TreeNode {
int val;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
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;
}
}
public class Main {
public static void main(String[] args) {
TreeNode head=new TreeNode(5);//849
TreeNode second=new TreeNode(3);//850
TreeNode three=new TreeNode(7);//851
TreeNode four=new TreeNode(2);//852
TreeNode five=new TreeNode(4);//853
TreeNode six=new TreeNode(6);//854
TreeNode seven=new TreeNode(8);//855
head.left=second;
head.right=three;
second.left=four;
second.right=five;
three.left=six;
three.right=seven;
Solution p = new Solution();
TreeNode root = p.KthNode(head,5);
System.out.println("序列化"+root.val);
}
}