61二叉搜索树的第k个结点

本文介绍了一种寻找二叉搜索树中第K大节点的方法,利用中序遍历的特性,通过栈实现非递归遍历,并计数找到目标节点。

题目描述

给定一颗二叉搜索树,请找出其中的第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;
    }    
};

 

转载于:https://www.cnblogs.com/dingxiaoqiang/p/8310982.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值