剑指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 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

思路:

  二叉搜索树,有规律,左子树的节点比根节点小,右子树的结点比根节点大,所以使用中序遍历可一个找到第k个节点

代码:

  

 1 /*************************************************************************
 2     > File Name: jz63.cpp
 3     > Author: wangshujing
 4     > Mail: [email protected]
 5     > Created Time: 2017年06月08日 星期四 11时01分05秒
 6  ************************************************************************/
 7 // 剑指offer 第 63 题:二叉搜索树的第k个节点
 8 #include<iostream>
 9 using namespace std;
10
11
12 /*
13 struct TreeNode {
14     int val;
15     struct TreeNode *left;
16     struct TreeNode *right;
17     TreeNode(int x) :
18             val(x), left(NULL), right(NULL) {
19     }
20 };
21 */
22
23
24 class Solution{
25 public:
26     TreeNode* KthNode (TreeNode* pRoot, int k){
27         if(pRoot == nullptr || k <=0){
28             return nullptr;
29         }
30         if(!s){
31             MS(pRoot,k);
32         }
33         if(s>=k){
34             return res;
35         }
36         return nullptr;
37     }
38     void MS(TreeNode* root, int &k){
39         if(root == nullptr){
40             return;
41         }
42         MS(root->left,k);
43         ++s;
44         if(s==k){
45             res = root;
46         }
47         if(s>k){
48             return;
49         }
50         MS(root->right,k);
51     }
52 private:
53     int s = 0;
54     TreeNode *res = nullptr;
55 };
时间: 2024-10-28 23:31:07

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

剑指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个结点 题意:给定一棵二叉搜索树,请找出其中的第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系列36----二叉搜索树的第k个节点

[题目]给定一颗二叉搜索树,请找出其中的第k大的结点. * 例如, 5 * / \ * 3 7 * / \ / \ * 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 中序遍历:2 3 4 5 6 7 8 1 package com.exe7.offer; 2 3 import java.util.Stack; 4 5 /** 6 * [题目]给定一颗二叉搜索树,请找出其中的第k大的结点. 7 * 例如, 5 8 * / \ 9 * 3 7 10 * / \ / \ 11 * 2 4

剑指OFFER之二叉搜索树与双向链表(九度OJ1503)

题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成排序的双向链表后,从链表头至链表尾的遍历结果. 样例输入: 1 2 1 0 0 3 0 0 样例输出: 1 2 3 解题思路

剑指offer (27) 二叉搜索树和双向链表

题目:输入一棵BST,将该BST转换成一个排序的双向链表 要求不能创建新的结点,只能调整树中结点指针的指向 在BST中,左子节点的值 小于父节点的之, 父节点的值小于 右子节点的值 因此我们在转换成有序的双向链表时,原先指向左子节点的指针调整为链表中指向前一个结点的指针 原先指向右子节点的指针调整为链表中指向后一个结点的指针 很自然的想到对BST进行中序遍历 当我们遍历转换到根节点(值为10的结点)时,它的左子树已经转换成 一个排序的链表了,并且处在链表中的最后一个结点是当前值最大的结点 我们把

【剑指offer】二叉搜索树转双向链表

转载请注明出处:http://blog.csdn.net/ns_code/article/details/26623795 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 输入: 输入可能包含多个测试样例.对于每个测试案例,输入的第一行为一个数n(0<n<1000),代表测试样例的个数.接下来的n行,每行为一个二叉搜索树的先序遍历序列,其中左右子树若为空则用0代替. 输出: 对应每个测试案例,输出将二叉搜索树转换成

【剑指offer】二叉搜索树转双向链表,C++实现

原创博文,转载请注明出处! # 题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向.要求不能创建任何新的节点,只能调整树中节点指针的指向. 二叉树节点的定义 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(NU

【Java】 剑指offer(33) 二叉搜索树的后序遍历序列

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则返回true,否则返回false.假设输入的数组的任意两个数字都互不相同. 思路 二叉树后序遍历数组的最后一个数为根结点,剩余数字中,小于根结点的数字(即左子树部分)都排在前面,大于根结点的数字(即右子树部分)都排在后面.根据遍历数组的这个特性,可以编写出一个递归函数,用于实现题目所要求的判断功能. 测

【Java】 剑指offer(36) 二叉搜索树与双向链表

本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集   题目 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 思路 二叉搜索树.排序链表,想到使用中序遍历. 要实现双向链表,必须知道当前结点的前一个结点.根据中序遍历可以知道,当遍历到根结点的时候,左子树已经转化成了一个排序的链表了,根结点的前一结点就是该链表的最后一个结点(这个结点必须记录下来,将遍历函数的返回值设置

剑指offer:二叉搜索树与双向链表

1.题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 2.解题思路: (1)将左子树构造成双向链表,并返回链表头节点: (2)定位左子树双链表的尾节点: (3)如果左子树链表不为空,将当前root连缀其链尾: (4)将右子树构造出双向链表,并返回链表头节点: (5)如果右子树链表不为空,将当前root连缀其表头: (6)根据左子树链表是否为空,确定返回的节点. 3.JavaScript实现: function Conv