数据范围: 0 \le n \le10000≤n≤1000,0 \le k \le10000≤k≤1000,树上每个结点的值满足0 \le val \le 10000≤val≤1000
进阶:空间复杂度 O(n)O(n),时间复杂度 O(n)O(n)
如输入{5,3,7,2,4,6,8},3时,二叉树{5,3,7,2,4,6,8}如下图所示:
该二叉树所有节点按结点值升序排列后可得[2,3,4,5,6,7,8],所以第3个结点的结点值为4,故返回对应结点值为4的结点即可。
示例1
输入:{5,3,7,2,4,6,8},3
返回值:4
示例2
输入:{},1
返回值:-1
备注:当树是空
第一种方法
直接中序遍历,把结果存储起来,然后从前往后取第k个数即可,代码如下
public int firstKthNode (TreeNode proot, int k) {
// write code here
if(proot == null || k < 1){
return -1;
}
List<Integer> list = new ArrayList<>();
ldr(proot,list);
if(k > list.size()){
return -1;
}
Integer integer = list.get(k - 1);
return integer;
}
public void ldr(TreeNode<Integer> treeNode, List<Integer> list){
if(treeNode != null){
ldr(treeNode.left,list);
list.add(treeNode.val);
ldr(treeNode.right,list);
}
}
第二种方法,就是不用list来存储,直接中序遍历,判断第k个数即可,代码如下
int count = 0;
int result = -1;
public int secondKthNode (TreeNode proot, int k) {
// write code here
if(proot == null || k < 1){
return -1;
}
secondKthNode(proot.left,k);
count++;
if(count == k){
result = proot.val;
}
secondKthNode(proot.right,k);
return result;
}