码迷,mamicode.com
首页 > 其他好文 > 详细

二叉搜索树的第k大的节点

时间:2019-01-14 23:08:20      阅读:177      评论:0      收藏:0      [点我收藏+]

标签:out   节点   --   void   creat   div   oid   signed   一个   

题目

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

思路

  如果中序遍历一棵二叉搜索树,遍历序列的数值则是递增排序,因此只需中序遍历一个二叉搜索树即可。

#include <iostream>
using namespace std;

struct tree
{
    double data;
    struct tree *left,*right;
    tree(int d=0):data(d)
    {
        left=right=nullptr;
    }
};
class Solution
{
    public:
        void create(tree *&root);
        tree *kth_node(tree * root,unsigned int k);
        tree *kth_node_core(tree *root,unsigned int &k);
        tree *root;    
};
void Solution::create(tree *&root)
{
    double x;
    cin>>x;
    if(x==0)
        root=nullptr;
    else
    {
        root=new tree();
        root->data=x;
        create(root->left);
        create(root->right);
    }
}
tree *Solution::kth_node(tree *node,unsigned int k)
{
    if(!node||k<=0)
        return nullptr;
    return kth_node_core(node,k);
}
tree *Solution::kth_node_core(tree *node,unsigned int &k)
{
    tree *target=nullptr;
    if(node->left)//遍历左子树 
        target=kth_node_core(node->left,k);
        
    if(!target)
    {
        if(k==1)
            target=node;
        --k;
    }
    if(!target&&node->right)//右子树 
        target=kth_node_core(node->right,k);
    return target;
}

int main()
{
    Solution s;
    s.create(s.root);
    tree *node=s.kth_node(s.root,4);
    if(node)
        cout<<node->data<<endl;
        
    return 0;
}

 

二叉搜索树的第k大的节点

标签:out   节点   --   void   creat   div   oid   signed   一个   

原文地址:https://www.cnblogs.com/tianzeng/p/10269202.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!