剑指offer系列之六十一:二叉树搜索树的第k个节点

来源:互联网 发布:主题制作软件下载 编辑:程序博客网 时间:2024/06/05 14:51

题目描述

给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。

因为二叉搜索树是排序的,所以如果需要找出第k个节点只需要进行中序遍历就可以得到第k节点。不过中序遍历的结果就是排序的,所以实质上就是插入排序。可以利用一个集合,在遍历的过程中利用插入排序的算法就能得到第k个节点。下面是这种实现思路的实现代码(已被牛客AC):

public class Solution {    //采用非递归中序遍历的方式得到第k大的节点    TreeNode KthNode(TreeNode pRoot, int k) {        if(pRoot== null) return pRoot;        //创建一个变量指向第k大的节点        int p = 0;        //创建一个栈用于保存遍历的顺序        Stack<TreeNode> s = new Stack<TreeNode>();        TreeNode curNode = pRoot;        while(curNode != null || !s.isEmpty()){            while(curNode != null){                s.add(curNode);                curNode = curNode.left;            }            if(!s.isEmpty()){                curNode = s.pop();                p++;                if(p == k) return curNode;                curNode = curNode.right;            }        }        return null;    }}
0 0
原创粉丝点击