Jz54 二叉搜索树的第K个结点

描述

给定一棵结点数为n 二叉搜索树,请找出其中的第 k 小的TreeNode结点值。

1.返回第k小的节点值即可

2.不能查找的情况,如二叉树为空,则返回-1,或者k大于n等等,也返回-1

3.保证n个节点的值不一样

二叉搜索树的第k个节点_牛客题霸_牛客网

二叉搜索树值的特点:left < mid < right

思路:copy by 二叉搜索树的第k个节点_牛客题霸_牛客网

        根据二叉搜索树的性质,我们可以尝试递归中序遍历,也就是从最小的一个节点开始,找到k个就是我们要找的目标。

1.栈实现

	//Solution1: Stack Inorder  O(N) O(N)
int KthNode(TreeNode* proot, int k) {
        // write code here
        if(!proot)return -1;
        TreeNode *pCur = proot;
        stack<TreeNode*>  treeStack;
        // treeStack.push(pCur);
        int cnt =  0;
        while(!treeStack.empty() || pCur ){
            while(pCur){
                treeStack.push(pCur);
                pCur = pCur->left;
            }
            
            TreeNode *popNode = treeStack.top();
            treeStack.pop();

            if(--k == 0)return popNode->val;
            pCur = popNode->right;
        }
        
        return -1;
    }
	

2.递归

	//Solution 2:inorder recursive O(N) O(N)
	int count = 0;
     TreeNode *res = nullptr;
     void findKthNode(TreeNode *proot, int k){ 
        if(!proot || count > k) return;
        findKthNode(proot->left, k);

        if(++count == k) res = proot;
        
        findKthNode(proot->right, k);
     }
     int KthNode(TreeNode *proot, int k){
        findKthNode(proot, k);

        if(res) return res->val;
        else return -1;
     }


	

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

给你。

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值