首页 > 其他 > 详细

面试题54.二叉树的第k大节点

时间:2020-03-15 22:32:32      阅读:82      评论:0      收藏:0      [点我收藏+]

给定一棵二叉搜索树,请找出其中第k大的节点。

示例 1:

输入: root = [3,1,4,null,2], k = 1
3
/ 1 4
2
输出: 4
示例 2:

输入: root = [5,3,6,2,4,null,null,1], k = 3
5
/ 3 6
/ 2 4
/
1
输出: 4

限制:

1 ≤ k ≤ 二叉搜索树元素个数

解法:二叉搜索树中序遍历得到的结果是从小到大有序的,因此将左根右的中序遍历转换为右根左的遍历,得到的结果就是从大到小的。

解法一:递归:

class Solution {
            int count = 0;
            int ans = 0;
            public int kthLargest(TreeNode root, int k) {
                helper(root,k);
                return ans;
            }
            public void helper(TreeNode node,int k) {
                if(node == null) {
                    return;
                }
                helper(node.right,k);
                if(++count == k) {
                    ans = node.val;
                    return;
                }
                helper(node.left,k);
            }
        }

解法二:迭代

利用一个栈,将根节点的右节点都压入栈,弹出栈顶,如果栈顶的左子节点不为空,就将左子节点及左子节点的右子节点全部压入栈,依次重复这个过程,直到栈为空为止。

访问的顺序就是右根左。

class Solution2 {
            public int kthLargest(TreeNode root, int k) {
                Stack<TreeNode> help = new Stack<>();
                int count = 0;
                int ans = 0;
                while(help != null) {
                    while(root != null) {
                        help.add(root);
                        root = root.right;
                    }
                    TreeNode node = help.pop();
                    if(++count == k) {
                        ans = node.val;
                        return ans;
                    }
                    root = node.left;
                }
                return ans;
            }
        }

面试题54.二叉树的第k大节点

原文:https://www.cnblogs.com/Jiewl/p/12500658.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!