题目描述
给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
思路:二叉搜索树的中序遍历是递增的序列,使用循环的中序遍历找到第k个节点就行了,对中序遍历的循环版本没理解,使用一个stack,找到最左边的节点,所以初始化的时候首先初始化节点,stack要为空。计数的cnt要初始化为0。不清楚的话就一个节点的时候判断一下,然后p = p->right,不需要判断为空,因为为空的话,上面的循环不会进入。
/* struct TreeNode {int val;struct TreeNode *left;struct TreeNode *right;TreeNode(int x) :val(x), left(NULL), right(NULL) {} }; */ class Solution { public:TreeNode* KthNode(TreeNode* pRoot, int k){if(pRoot == nullptr){return nullptr;}stack<TreeNode*> s; //s.push(pRoot);TreeNode* p = pRoot;int cnt = 0;while(!s.empty() || p != nullptr){while(p != nullptr){s.push(p);p = p->left;}if(!s.empty()){p = s.top();s.pop(); ++cnt;if(cnt == k){return p;} p = p->right; }}return nullptr;} };