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

本文介绍了一种寻找二叉搜索树中第K大节点的方法,通过中序遍历实现。示例中,5作为根节点的二叉树中,第3大的节点值为4。代码使用Java实现。

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

 

转载于:https://www.cnblogs.com/noaman/p/5590639.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值