剑指offer系列36----二叉搜索树的第k个节点
Posted noaman_wgs
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了剑指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 }
以上是关于剑指offer系列36----二叉搜索树的第k个节点的主要内容,如果未能解决你的问题,请参考以下文章
每日一题 - 剑指 Offer 54. 二叉搜索树的第k大节点