题目:
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
5
/ \
3 7
/ \ / \
2 4 6 8
解析:
方法一: 中序遍历二叉搜索树(递归方式),得到从小到大的排好序的数,然后找出第k个结点。
方法二: 利用栈求解,直接看代码。
参考答案:
/***
* typedef struct node{
* int val;
* struct node *left;
* struct node *right;
* }TreeNode;
*/
class Solution{
public:
//方法一:中序遍历(递归)
void Inorder(TreeNode* pRoot, vector<TreeNode*>& arr){
if(nullptr == pRoot)
return;
Inorder(pRoot->left, arr);
arr.push_back(pRoot);
Inorder(pRoot->right, arr);
}
TreeNode* KthNode(TreeNode* pRoot, int k){
if(nullptr == pRoot || k <= 0)
return nullptr;
vector<TreeNode*> arr;
Inorder(pRoot, arr);
if(k > arr.size())
return nullptr;
return arr[k - 1];
}
//方法二:栈的解法
TreeNode* KthNode(TreeNode* pRoot, int k){
if(nullptr == pRoot || k <= 0)
return nullptr;
TreeNode* Node = pRoot;
stack<TreeNode*> st;
while(nullptr != Node || !st.empty()){
while(nullptr != Node){
st.push(Node);
Node = Node->left;
}
if(!st.empty()){
Node = st.top();
st.pop();
k--;
if(k == 0){
return Node;
}
Node = Node->right;
}
}
return nullptr;
}
};