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

题目

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

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

时间: 2024-10-13 04:46:41

二叉搜索树的第k大的节点的相关文章

【剑指offer】【树】54.二叉搜索树的第k大节点

二叉搜索树的第k大节点 递归法 中序遍历的二叉搜索树序列为单调递增的序列,将中序遍历的结果放到vector中,第k大的数为v.size()-k位置的数 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ cl

二叉搜索树的第K大节点

题目: 输入一个颗二叉树搜索树,请找出其中的第K大节点. 解答: 1 public class Solution { 2 3 public TreeNode kthNode(TreeNode root, int k) { 4 if(root == null || k == 0) { 5 return null; 6 } 7 8 return kthNodeCore(root, k); 9 } 10 11 private static TreeNode kthNodeCore(TreeNode r

二叉搜索树的第k个结点-剑指Offer

二叉搜索树的第k个结点 题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如,5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 思路 对于二叉搜索树,中序遍历的结果是按照顺序来的,我们设置一个变量用来计数,递归的遍历树,如果到了第k个,则把那个数取出来,我在这用的是ArrayList来存储那个结点 还可以在递归方法中直接返回结点,无需用ArrayList跟踪存储,更加简化 代码 import java.util.ArrayList; /* pub

剑指offer之【二叉搜索树的第k个节点】

题目: 二叉搜索树的第k个结点 链接: https://www.nowcoder.com/practice/ef068f602dde4d28aab2b210e859150a?tpId=13&tqId=11215&rp=3&ru=%2Fta%2Fcoding-interviews&qru=%2Fta%2Fcoding-interviews%2Fquestion-ranking&tPage=4 题目描述: 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \

剑指Offer对答如流系列 - 二叉搜索树的第k个结点

面试题54:二叉搜索树的第k个结点 题目描述 给定一棵二叉搜索树,请找出其中的第k小的结点. 例如,图中的二叉搜索树,按节点值大小顺序,第三大节点的值是4. 二叉搜索树的节点定义 public class Node { int val = 0; Node left = null; Node right = null; public Node(int val) { this.val = val; } } 问题分析 二叉搜索树中序遍历的结果是顺序的.我们可以设置一个全局变量index,对二叉搜索树进

【剑指offer】二叉搜索树的第k个结点

题目链接:二叉搜索树的第k个结点 题意:给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8)    中,按结点数值大小顺序第三小结点的值为4. 题解:之前有讲过BST的性质,中序遍历就可以得到一个递增的序列.也就是第k小就用这个性质. 遍历左子树,如果在左子树中找到节点,返回.没有就继续根,右子树... 代码: 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNod

剑指offer 62.二叉搜索树的第k个结点

剑指offer 62.二叉搜索树的第k个结点 题目 给定一棵二叉搜索树,请找出其中的第k小的结点.例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4. 思路 二叉搜索树的中序遍历是递增的,找到第k小的话,那就只需要中序遍历即可,遍历的第k个数就是所需的数. 代码 public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int v

剑指offer(六十二)之二叉搜索树的第k个结点

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 代码: <span style="color:#cc33cc;">/* public class TreeNode { int val = 0; TreeNode left = null; TreeNode right = null; public TreeNode(int val) { this.val = val;

二叉搜索树的第k个结点(剑指offer)

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), right(NULL) { 8 } 9 }; 10 */ 11 class Solut