題目描述
給定一棵二叉搜索樹,請找出其中的第k小的結點。例如, (5,3,7,2,4,6,8) 中,按結點數值大小順序第三小結點的值為4。
分析
二叉搜索樹的一個特點就是二叉搜索樹的中序遍歷得到的序列是遞增有序的,那么想要獲得節點數值大小順序第幾,可以通過中序遍歷得到的序列獲得。
方法一
采用ArrayList保存獲得的序列
TreeNode KthNode(TreeNode pRoot, int k) {
if(pRoot == null || k <= 0) {
return null;
}
ArrayList<TreeNode> list = new ArrayList<TreeNode>();
MiddleList(pRoot, list);
if(k > list.size()) {
return null;
}
return list.get(k - 1);
}
public void MiddleList(TreeNode node, ArrayList<TreeNode> list) {
if(node != null) {
MiddleList(node.left, list);
list.add(node);
MiddleList(node.right, list);
}
}
方法二
在遞歸時通過一個計數器,這里需要注意的是當計數器等於k值時表示已經找到相應的節點,這時候需要一層層的返回該節點。
int index = 0;
TreeNode KthNode_2(TreeNode pRoot, int k) {
if(pRoot != null) {
TreeNode node = KthNode_2(pRoot.left, k);
if(node != null) {
return node;
}
index++;
if(index == k) {
return pRoot;
}
node = KthNode_2(pRoot.right, k);
if(node != null) {
return node;
}
}
return null;
}