作者:先人掌 | 来源:互联网 | 2024-11-01 21:54
在二叉搜索树(BST)中,每个节点的值都大于其左子树中的所有节点值,小于其右子树中的所有节点值,因此BST具有天然的有序性。本文探讨了如何在给定的BST中找到第k小的节点。例如,在节点值分别为5、3、7、2、4、6、8的BST中,第三小的节点值为4。通过中序遍历,可以有效地找到第k小的节点,确保算法的时间复杂度为O(h+k),其中h是树的高度。
BST有序性理解
给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4
解题思路:
BST本身就是有序的(左子树小于根结点, 右子树大于根结点),中序遍历即是升序
要求第k小,即中序遍历时到达第k个元素(二叉搜索树,不存在两个相同的节点值)
采用循环中序遍历的方式(不使用递归), 拿到一个根结点, 先把所有的左节点压栈(通过根结点得到左节点,访问完左节点,才访问根结点—>根结点先进后出—> 选栈结构)
中序采用do{…}while()语句, 先让他执行一次,先把所有结点全入栈(以一个根结点出发的所有左节点)
即就是在搜素二叉树中, 中序找第k个结点
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 || k <= 0){return nullptr; }stack<TreeNode*> st; TreeNode* node = pRoot;do{while(node != nullptr){ st.push(node);node = node->left;}if(!st.empty()){ node = st.top();st.pop();k--;if(k == 0){return node; }node = node->right;}}while (node != nullptr || !st.empty());return nullptr;}
};