首页 > 其他 > 详细

剑指OFFER_二叉搜索树的第k个节点

时间:2020-06-27 15:59:46      阅读:66      评论:0      收藏:0      [点我收藏+]

剑指OFFER_二叉搜索树的第k个节点

题目描述

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

思路

对二叉搜索树进行排序,很自然就想到了中序遍历,即先输出左子树,然后根节点,最后右子树;

那么要输出第k小的节点,就需要在最左边的节点开始计数,回溯到第k个时输出即可;

那么为了从最小的节点开始计算,设置一个flag,当搜索到底层的时候设置flag,开始计数;

然后当计数器达到k的时候,保存此节点并退出;

不过程序还有待优化的地方,就是这里推出后,还会有后续的节点会继续遍历,可以考虑设置一个开关跳出递归;

代码

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};
*/
class Solution {
public:
    int t = 0, k = 0;
    bool flag = false;
    TreeNode* ans = NULL;
    void dfs(TreeNode* node) {
        if (!node) {
            flag = true;
            return;
        }
        dfs(node->left);
        if (flag) {
            ++t;
            if (t == k) {
                ans = node;
                return;
            }
        }
        dfs(node->right);
    }
    TreeNode* KthNode(TreeNode* pRoot, int k)
    {
        this->k = k;
        dfs(pRoot);
        return this->ans;
        
    }

    
};

剑指OFFER_二叉搜索树的第k个节点

原文:https://www.cnblogs.com/sakurapiggy/p/13198339.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!