原来可以中序遍历求解啊,没想到哈哈。
- 用的递归,先判断左右子树的节点数,k与之比较
- 当小于等于左子树节点数时,目标节点就是左子树的第k小;
- 当k等于左子树节点数+1时,目标节点就是根节点;
- 当k大于左子树节点+1时,目标节点为右子树的第(k-左子树节点数-1)小。
/*
* function TreeNode(x) {
* this.val = x;
* this.left = null;
* this.right = null;
* }
*/
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
*
* @param proot TreeNode类
* @param k int整型
* @return int整型
*/
function KthNode( proot , k ) {
// write code here
// 树的节点总数
let nodeNumber = nodeNum(proot);
if (k > nodeNumber || ! proot) {
return -1;
}
// 左子树节点数
let nodeNumberLeft = nodeNum(proot.left);
// 右子树节点数
let nodeNumberRight = nodeNumber - nodeNumberLeft - 1;
if (k <= nodeNumberLeft) {
return KthNode(proot.left, k);
} else if (k == nodeNumberLeft + 1) {
return proot.val;
} else {
return KthNode(proot.right, k - nodeNumberLeft - 1);
}
return -1;
}
//计算树的节点数
function nodeNum (proot) {
if (!proot) {
return 0;
}
return nodeNum(proot.left) + nodeNum(proot.right) + 1;
}
module.exports = {
KthNode : KthNode
};