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

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

知识点:二叉树
题目链接

题目描述

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

输入: {5,3,7,2,4,6,8},3
输出: {4}
解释: 按结点数值大小顺序第三小结点的值为4

解题思路

  1. 这里有两种解法:递归和非递归
  2. 我们知道这是一颗二叉搜索树,中序遍历的结果是有序的,最简单的就是中序遍历放入数组中,这里就不在赘述
  3. 对于递归的方法:我们需要定义答案结点和比较次数,注意返回条件:如果结点为空就返回;递归顺序:中序;我们需要对根这部分操作,比较次数+1==k 说明找到了就返回
  4. 对于非递归的方法:用stack模拟中序遍历,如果结点存在或者栈中不空,一直往左找,弹出一个k–,比较k是否为0,往右结点找。参考

代码

#include "cheader.h"
 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) {
        stack<TreeNode*> s;
        TreeNode* tmp = pRoot;
        while(!s.empty() || tmp != nullptr){
            while(tmp != nullptr){
                s.push(tmp);
                tmp = tmp->left;
            }
            tmp = s.top();s.pop();
            k--;
            if(k == 0)return tmp;
            tmp = tmp->right;
        }
        return nullptr;
    }
    
    TreeNode* ans = nullptr;
    int c = 0;
    TreeNode* KthNode2(TreeNode* pRoot,int k){
        dfs(pRoot,k);
        return ans;
    }
    void dfs(TreeNode* pRoot,int k){
        if(pRoot == nullptr)
            return;
        dfs(pRoot->left,k);
        c++;
        if(k == c){
            ans = pRoot;
            return;
        }
        dfs(pRoot->right,k);
    }
};

今天也是爱zz的一天!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值