《剑指offer》给定一颗二叉搜索树,请找出其中的第k大的结点。
2017-07-26 09:41
411 查看
题目:给定一颗二叉搜索树,请找出其中的第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 val) { this.val = val; } } */ import java.util.*; public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { if(k==0){ return null; } List<Integer> list = new ArrayList<>();//存节点的值 Queue<TreeNode> queue = new LinkedList<>();//存节点 if(pRoot==null){ return null; } queue.add(pRoot); int current =1; int next=0; while (!queue.isEmpty()){//层次遍历二叉树,然后得到所有节点的值 TreeNode node=queue.poll(); current--; list.add(node.val); if(node.left!=null){ queue.add(node.left); next++; } if(node.right!=null){ queue.add(node.right); next++; } if(current==0){ current=next; next=0; } } Collections.sort(list);//给遍历的二叉树值的list排序,得到第k大的节点信息 if(k>list.size()){ return null; } int num=list.get(k-1); queue.clear(); queue.add(pRoot); current=1; next=0; TreeNode result=null; while (!queue.isEmpty()){ TreeNode node=queue.poll(); current--; if(node.val==num){//找到第k大的节点信息,然后返回 result=node; return result; } if(node.left!=null){ queue.add(node.left); next++; } if(node.right!=null){ queue.add(node.right); next++; } if(current==0){ current=next; next=0; } } return result; } }
相关文章推荐
- 给定一颗二叉搜索树,请找出其中的第k小的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
- 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
- 《剑指offer》刷题笔记(树):二叉搜索树的第k个结点
- 剑指Offer(54)二叉搜索树的第K大结点
- 两数之和:给定一个整数数组,找出其中两个数相加等于目标值
- 给定一篇英文文章,找出其中使用频率最高的英语单词。
- 找出二叉搜索树第k大的节点
- Java-找出单链表的倒数第k结点
- 剑指offer—二叉搜索树的第k个结点
- 剑指Offer:二叉搜索树的第K个结点
- 面试题1: 给定一个数组, 里面是一些数字, 请只用一个for循环, 找出其中第二大的数字.
- 程序员面试金典——解题总结: 9.18高难度题 18.7给定一组单词,编写一个程序,找出其中的最长单词,且该单词由这组单词中的其他单词组合而成。
- 剑指offer(59)-二叉搜索树的第k个结点
- 给定一个无序整形数组,找出其中所以三个数之和为0的所有组合
- 给定一颗二叉树,以及其中的两个node(地址均非空),要求给出这两个node的一个公共父节点,使得这个父节点与两个节点的路径之和最小。
- leetcode-java.T001_TwoSum 给定一个整数数组,找出其中两个数满足相加等于你指定的目标数字
- 有个排序后的字符串数组,其中散布着一些空字符串,找出给定字符串的位置