剑指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 6 8 中,按结点数值大小顺序第三个结点的值为4。 中序遍历:2 3 4 5 6 7 8
12  * @author WGS
13  *
14  */
15 public class BiTreeKthNode {
16     static class TreeNode{
17         int val;
18         TreeNode left=null;
19         TreeNode right=null;
20         public TreeNode(int val){
21             this.val=val;
22         }
23     }
24
25     public TreeNode getKthNode(TreeNode pRoot,int k){
26         if(pRoot==null ) return pRoot;
27         TreeNode curNode=pRoot;
28         Stack<TreeNode> stack=new Stack<>();
29         int p=0;
30
31         while(curNode!=null || !stack.isEmpty()){
32             while(curNode!=null){
33                 stack.push(curNode);
34                 curNode=curNode.left;
35             }
36             if(!stack.isEmpty()){
37                 curNode=stack.pop();
38                 p++;
39                 if(p==k) return curNode;
40                 curNode=curNode.right;
41             }
42         }
43         return null;
44     }
45
46     public static void main(String[] args) {
47
48         BiTreeKthNode b=new BiTreeKthNode();
49         TreeNode root=new TreeNode(5);
50         TreeNode node1=new TreeNode(3);
51         TreeNode node2=new TreeNode(7);
52         TreeNode node3=new TreeNode(2);
53         TreeNode node4=new TreeNode(4);
54         TreeNode node5=new TreeNode(6);
55         TreeNode node6=new TreeNode(8);
56         root.left=node1;
57         root.right=node2;
58         node1.left=node3;
59         node1.right=node4;
60         node2.left=node5;
61         node2.right=node6;
62
63         TreeNode node=b.getKthNode(root, 2);
64         System.out.println(node.val);
65     }
66
67 }
时间: 2024-08-25 23:58:22

剑指offer系列36----二叉搜索树的第k个节点的相关文章

剑指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系列——26.二叉搜索树与双向链表??

Q:输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. T:利用一个栈实现二叉树的中序遍历,题中说这是一颗二叉树,那么二叉树的中序遍历是一个有顺序的,? 那么这个时候只需要在中序遍历的时候当找到一个遍历节点的时候先将这个节点保存起来,然后遍历下一个节点的时候将之前保存的节点的right域指向下一个结点,下一个结点的left域指向上一个结点.这样一来就形成了一个排序的双向链表.然后将之前指向保存的指针指向当前这个结点. //递归版 p

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

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

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

题目: 二叉搜索树与双向链表 链接: https://www.nowcoder.com/practice/947f6eb80d944a84850b0538bf0ec3a5?tpId=13&tqId=11179&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指

剑指offer 24:二叉搜索树的后序遍历序列

题目描述 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入的数组的任意两个数字都互不相同. 解题思路 后序遍历,顾名思义根节点位于尾部,故可将一个序列分为左子树序列.右子树序列和根节点,对于两个子序列又可分别验证是否是二搜索叉树的后序序列,即此问题是一个递归问题.递归的出口是系列中仅包含一个元素. C++代码实现 class Solution { public: bool VerifySquenceOfBST(vector<int> s

剑指offer之【二叉搜索树的后序遍历序列】

题目: 二叉搜索树的后序遍历序列 链接: https://www.nowcoder.com/practice/a861533d45854474ac791d90e447bafd?tpId=13&tqId=11176&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述: 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果.如果是则输出Yes,否则输出No.假设输入

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

from collections import deque class TreeNode(object): def __init__(self, x): self.val = x self.left = None self.right = None class Tree(object): """ 非二叉搜索树,建树的时候values中的顺序需要注意 之后有时间会改成二叉搜索树 """ def __init__(self): self.root =

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

题目描述 输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建任何新的结点,只能调整树中结点指针的指向. 解题思路 采用中序遍历遍历二叉树,利用二叉排序树的特性,顺次连接节点,形成双向链表. C++代码实现 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { } };*/

剑指OFFER之从二叉搜索树的后序遍历序列(九度OJ1367)棕醉子自纂篆

http://www.ebay.com/cln/9nj_nzfn/2015.01.29/166638639010 http://www.ebay.com/cln/pr1_tltp/2015.01.29/166523457017 http://www.ebay.com/cln/blv_nvvh/2015.01.29/166611322014 http://www.ebay.com/cln/ddl_ffnv/2015.01.29/166591738018 http://www.ebay.com/cl

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