求BST中第K个最小的元素

给定一棵 BST,请在这棵 BST 上查找其对应的升序序列中的第 k 个元素(即第 k 小元素)。如下图的 BST,如果 k=3,那么所求节点为 10,如果 k=5,那么所求节点为 14。

求BST中第K个最小的元素_第1张图片

解法一:中序遍历法,我们用一个栈作为辅助进行中序遍历,在遍历过程中,对出栈次数进行计数,出栈 k 次时即找到我们要的节点。算法复杂度为 O(n),n 为树的节点总数,算法描述如下:

/* initialization */
pCrawl = root
set initial stack element as NULL (sentinal)

/* traverse upto left extreme */
while(pCrawl is valid )
   stack.push(pCrawl)
   pCrawl = pCrawl.left

/* process other nodes */
while( pCrawl = stack.pop() is valid )
   stop if sufficient number of elements are popped.
   if( pCrawl.right is valid )
      pCrawl = pCrawl.right
      while( pCrawl is valid )
         stack.push(pCrawl)
         pCrawl = pCrawl.left

C 实现

#include 
#include 
 
#define ARRAY_SIZE(arr) sizeof(arr)/sizeof(arr[0])
 
/* just add elements to test */
/* NOTE: A sort

你可能感兴趣的:(剑指offer-算法与数据结构)