二叉搜索树的第k个结点

题目描述

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

/*
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)
    {
        if(!pRoot || k <= 0)
            return NULL;

        stack<TreeNode *> stk;
        TreeNode *res = NULL;

        TreeNode *p = pRoot;
        int index = 0;

        while(p || !stk.empty()){
            while(p){
                stk.push(p);
                p = p->left;
            }

            if(!stk.empty()){
                p = stk.top();
                stk.pop();

                index++;

                if(index == k){
                    res = p;
                    break;
                }

                p = p->right;
            }
        }

        return res;
    }
};
时间: 2024-08-04 04:13:21

二叉搜索树的第k个结点的相关文章

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

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

剑指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

《剑指offer》:[63]二叉搜索树的第K个结点

题目:给定一棵二叉搜索树,请找出其中的第K大的结点. 例如在下图中的二叉树,第四个结点就是:5. 分析:这个题目比较简单,得到二叉树的第K个值,因为我们知道中序遍历一棵二叉排序树得到的就是有序的序列.所以我们采用中序遍历和一个计数器count就可以实现了! 具体实现代码如下: #include <iostream> using namespace std; struct BinaryTree { int data; BinaryTree *pLeft; BinaryTree *pRight;

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

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 思路 二叉搜索树的中序遍历的输出结果是拍好序的,直接输出第K个即可 1 public class Solution { 2 int time = 0; 3 TreeNode KthNode(TreeNode root, int k){ 4 if(root==null) return null; 5 TreeNode node = KthNod

剑指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 / \