【剑指Offer】面试题63:二叉搜索树的第k个结点

来源:互联网 发布:民间融资数据 编辑:程序博客网 时间:2024/06/10 10:34

一:题目描述

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4


二:解题思路

 二叉搜索树特点:左子结点的值小于根节点,根节点小于右子节点的值
 按照中序遍历二叉搜索树,可以得到一个排序好的序列,第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)    {        //非递归实现        //二叉搜索树特点:左子结点的值小于根节点,根节点小于右子节点的值        //按照中序遍历二叉搜索树,可以得到一个排序好的序列,第k个值就是我们要找的        if(pRoot==NULL || k<=0)            return NULL;                TreeNode* pNode=pRoot;        int currentNum=0;                stack<TreeNode* > stackTree;        stackTree.push(pNode);                //将树的最左侧全部压栈,此时的栈顶元素是整棵树的最小值        while(pNode->left!=NULL){            stackTree.push(pNode->left);            pNode=pNode->left;        }                while(!stackTree.empty()){            pNode=stackTree.top();            stackTree.pop();                        currentNum++;            if(currentNum==k)                return pNode;            if(pNode->right!=NULL){                stackTree.push(pNode->right);                                //注意了,很重要,很重要,很重要!                //将pNode->right根节点最左侧全部压栈                //保证栈顶元素是当前最小值                pNode=pNode->right;                while(pNode->left!=NULL){                    stackTree.push(pNode->left);                    pNode=pNode->left;                }//while            }//if        }//while                //如果n的大小大于二叉树的所有结点数        return NULL;    }};

递归版(不容易理解-还没有参透)

/*struct TreeNode {    int val;    struct TreeNode *left;    struct TreeNode *right;    TreeNode(int x) :            val(x), left(NULL), right(NULL) {    }};*/class Solution {public:    int index=0;//计数器    TreeNode* KthNode(TreeNode* pRoot, int k)    {                //递归实现                if(pRoot!=NULL){                        //找到root最左子结点            TreeNode* pNode=KthNode(pRoot->left,k);            if(pNode!=NULL)                return pNode;                        index++;            if(index==k)                return pRoot;            pNode=KthNode(pRoot->right,k);            if(pNode!=NULL)                return pNode;        }        return NULL;    }};