作者:先人掌 | 来源:互联网 | 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 ; } } ;