叉搜索树的第k个结点

http://blog.csdn.net/qq_27703417/article/details/70979511

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

思路:这里的第k大结点就是指按从小到大顺序排列后的第k个结点。显然题目很简单,搜索二叉树按照中序遍历就是一个有序的序列,于是中序遍历这个二叉树,每次遍历一个结点记录一个计数器,当计算到count=k的结点就是所求的结点。可以使用递归或者循环来解决。使用递归时思考:如何在递归的同时记录计数器?中序遍历时,总是先处理左子树—再处理中间结点即遍历—再处理右子树,因此每次在处理中间结点时进行计数即可。递归中如何当count==k时结束全部递归的调用而不需要遍历全部的结点?

F1:当count==k时就及时return,那么在本次递归调用过程中,在本层就不需要遍历root的右子树,直接返回到上一层,在上一层还是要判断count==k,并且如果不满足还是要执行this.process(root.right,k)来遍历右子树,即添加return后只是在本层中可以不用遍历右子树,在其他层还是要遍历右子树的,即还是要执行return后的代码。例如上面的二叉树中,如果k=2,那么要查找的结点时③,于是根据下面的程序,在遍历到结点③时就return,于是结点③的右子树不会遍历,即结点④不会遍历,但是之后的层次的右子树还是会遍历的,例如⑤的右子树都会遍历,此时遍历结束后的count=6,即不用遍历1个结点;如果k=4,那么结点⑤是要查找的结点,当遍历到结点⑤时就return,于是结点⑤的右子树都不会遍历,此时遍历完成后后count=4,即不用遍历3个结点。

[java] view plain copy

print?

  1. //给定一棵搜索二叉树找第k大结点,中序遍历,递归,遍历的同时进行计数
  2. public class Solution {
  3. TreeNode res;
  4. int count=0;
  5. TreeNode KthNode(TreeNode pRoot, int k){
  6. //特殊输入
  7. if(pRoot==null) return null;
  8. //调用递归方法解决问题
  9. this.process(pRoot,k);
  10. return res;
  11. }
  12. //递归方法:找出二叉树中序遍历中的第k个值
  13. private void process(TreeNode root,int k){
  14. //边界条件:遍历到最后的空节点时显然说明找不到,于是返回null
  15. if(root==null) return;
  16. //①先遍历左边的子树
  17. this.process(root.left,k);
  18. //②遍历当前结点,同时计数
  19. if(++count==k){
  20. res=root;
  21. //?1:这里可以不加return,但是加上return表示一旦找到结点之后的右子树就不用再遍历了
  22. return;
  23. }
  24. //③遍历右子树
  25. this.process(root.right,k);
  26. }
  27. }
时间: 2025-01-05 23:41:16

叉搜索树的第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;

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

题目描述 给定一颗二叉搜索树,请找出其中的第k大的结点.例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4. 解题思路:使用中序遍历进行遍历,得到的就是按照顺序的,当遍历到第k个就输出即可. 1 /* 2 struct TreeNode { 3 int val; 4 struct TreeNode *left; 5 struct TreeNode *right; 6 TreeNode(int x) : 7 val(x), left(NULL), ri

二叉搜索树的第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

二叉搜索树的第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*

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

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