题目描述
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。
考察点:中序遍历的理解。
思路1:直接将树的中序遍历结果拿到,然后去找。
class Solution {
public:
void InOrder(TreeNode* pRoot,vector<TreeNode*> &v)//获取中序遍历的结果
{
if (pRoot == NULL)
return;
InOrder(pRoot->left, v);
v.push_back(pRoot);//将节点进入数组保存
InOrder(pRoot->right, v);
}
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if (pRoot == NULL || k <= 0)//边界判断条件特别重要
return NULL;
vector<TreeNode*> result;
InOrder(pRoot, result);
if (k > result.size())//这里也需要加判断
return NULL;
return result[k-1];
}
};
思路2:非递归进行中序遍历。注意指针走向。
class Solution {
public:
TreeNode* KthNode(TreeNode* pRoot, int k)
{
if (pRoot == NULL || k < 0)
return NULL;
int index = 0;
stack<TreeNode*> stack;
while (!stack.empty() || pRoot!=NULL)
{
while (pRoot!=NULL)//先去左子树找节点
{
stack.push(pRoot);
pRoot = pRoot->left;//一直走到最左,其中根节点也已经入栈。
}
pRoot = stack.top(); stack.pop();//获取栈顶元素并且出栈
index++;
if (index == k)
return pRoot;//如果相等,就可以返回
pRoot = pRoot->right;//去右子树找节点
}
return NULL;
}
};