剑指offer面试题63:二叉搜索树的第k个节点 Java实现
2016-10-17 22:31
525 查看
题目:二叉搜索树的第k个节点
给定一颗二叉搜索树,请找出其中的第k大的节点。例如,下图中的二叉搜索树中,按节点数值大小顺序第三个节点的值 是4.
算法分析:
如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。上图中的二叉搜索树的中序遍历序列为{2,3,4,5,6,7,8},因此,只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。
算法源程序:
程序运行结果:
给定一颗二叉搜索树,请找出其中的第k大的节点。例如,下图中的二叉搜索树中,按节点数值大小顺序第三个节点的值 是4.
算法分析:
如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。上图中的二叉搜索树的中序遍历序列为{2,3,4,5,6,7,8},因此,只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。
算法源程序:
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 号:v1.0 * 题目描述:二叉搜索树的第k个节点 * 给定一颗二叉搜索树,请找出其中的第k大的节点。例如,下图中的二叉搜索树中,按节点数值大小顺序第三个节点的值 是4. * 输入描述:无 * 程序输出:第3大的节点是: * 4 * 问题分析: 无 * 算法描述:如果按照中序遍历的顺序遍历一棵二叉搜索树,遍历序列的数值是递增排序的。 * 上图中的二叉搜索树的中序遍历序列为{2,3,4,5,6,7,8},因此,只需要用中序遍历算法遍历一棵二叉搜索树,就很容易找出它的第k大结点。 * 完成日期:2016-10-17 ***************************************************************/ package org.marsguo.offerproject63; class TreeNode{ int val; public TreeNode left = null; public TreeNode right = null; public TreeNode(int val){ this.val = val; } public String toString(){ return val + ""; } } class SolutionMethod1{ public TreeNode inorderTraversal(TreeNode root,int k){ if(root == null || k == 0){ return null; } int[] temp = {k}; return inorderTraversalCore(root,temp); } public TreeNode inorderTraversalCore(TreeNode root,int[] k){ TreeNode target = null; if(root.left != null ) target = inorderTraversalCore(root.left,k); if(target == null){ if(k[0] == 1) target = root; k[0]--; } if(target == null && root.right != null) target = inorderTraversalCore(root.right, k); return target; } } public class KthNode { public static void main(String[] args){ SolutionMethod1 solution1 = new SolutionMethod1(); TreeNode n1 = new TreeNode(5); TreeNode n2 = new TreeNode(3); TreeNode n3 = new TreeNode(7); TreeNode n4 = new TreeNode(2); TreeNode n5 = new TreeNode(4); TreeNode n6 = new TreeNode(6); TreeNode n7 = new TreeNode(8); // TreeNode n8 = new TreeNode(8); // TreeNode n9 = new TreeNode(9); n1.left = n2; n1.right = n3; n2.left = n4; n2.right = n5; n3.left = n6; n3.right = n7; // n4.left = n8; // n4.right = n9; System.out.println("第" + 3 + "大的节点是:"); System.out.println(solution1.inorderTraversal(n1, 3)); } }
程序运行结果:
相关文章推荐
- 剑指Offer 面试题22:链表中倒数第k个节点 Java代码实现
- 《剑指Offer》学习笔记--面试题63:二叉搜索树的第k个结点
- 剑指offer面试题63 二叉搜索树的第k个结点
- 剑指offer 面试题63:二叉搜索树的第k个结点(二叉树中序遍历的应用) 题解
- JAVA实现链表中倒数第K个节点问题(《剑指offer》)(考虑问题要全面)
- 剑指offer----二叉搜索树的第K个节点----java实现
- 剑指Offer:面试题27——二叉搜索树与双向链表(java实现)
- 剑指Offer 面试题23:链表中环的入口节点 Java代码实现
- 剑指offer--面试题63:二叉搜索树的第k个结点
- 剑指offer--面试题24:二叉搜索树的后序遍历序列--Java实现
- 剑指offer面试题58 二叉树的下一个节点(Java实现)
- JAVA实现链表中倒数第K个节点问题(《剑指offer》)
- 剑指offer——面试题63:二叉搜索树的第k个结点
- 剑指offer面试题63 序列化二叉树(java实现)
- 剑指offer编程题Java实现——面试题13在O(1)时间内删除链表节点
- 面试题63:二叉搜索树的第K个节点
- 剑指Offer:面试题24——二叉搜索树的后序遍历序列(java实现)
- 《剑指offer》面试题63 二叉搜索树的第k个结点
- 剑指Offer:面试题8——旋转数组的最小值(java实现)
- 剑指offer 面试题51 java实现