题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
解题思路
二叉搜索树-二叉排序树 特点:左<中<右 二叉搜索树中序遍历为从小到大的一组树 即,中序遍历树,每个结点存在ArrayList中,当k>=1并且list.size()>=k,返回list.get(k-1) 否则,返回null
二叉树中序遍历-递归法
import java
.util
.*
;
public class Solution {
List
<TreeNode> list
= new ArrayList<>();
TreeNode
KthNode(TreeNode pRoot
, int k
)
{
count(pRoot
);
if(k
>=1 && list
.size()>k
-1){
return list
.get(k
-1);
}
return null
;
}
public void count(TreeNode p
){
if(p
!=null
)
{
count(p
.left
);
list
.add(p
);
count(p
.right
);
}
}
}
二叉树中序遍历-非递归
import java
.util
.*
;
public class Solution {
TreeNode
KthNode(TreeNode pRoot
, int k
)
{
Stack
<TreeNode> stack
= new Stack<>();
TreeNode p
= pRoot
;
if(pRoot
== null
|| k
<1)
return null
;
while(!stack
.empty() || p
!=null
)
{
if(p
!=null
){
stack
.push(p
);
p
= p
.left
;
}
else{
p
= stack
.pop();
k
--;
if(k
==0){
return p
;
}
p
= p
.right
;
}
}
return null
;
}
import java
.util
.*
;
public class Solution {
List
<TreeNode> list
= new ArrayList<>();
TreeNode
KthNode(TreeNode pRoot
, int k
)
{
count(pRoot
);
if(k
>=1 && list
.size()>=k
){
return list
.get(k
-1);
}
return null
;
}
public void count(TreeNode p
){
Stack
<TreeNode> stack
= new Stack<>();
while(!stack
.empty() || p
!=null
)
{
if(p
!=null
){
stack
.push(p
);
p
= p
.left
;
}
else{
p
= stack
.pop();
list
.add(p
);
p
= p
.right
;
}
}
}
}