zoukankan      html  css  js  c++  java
  • 面试题54.二叉树的第k大节点

    给定一棵二叉搜索树,请找出其中第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;
    		    }
    		}
    
  • 相关阅读:
    基于XML的声明式事务控制
    spring中JdbcTemplate使用
    四种常用的通知类型(xml)
    AOP配置步骤(XML)
    12388. 图论割边
    12389. 割点
    12206. 电缆网络
    12178. 破坏牛棚
    java反射笔记
    java单元测试
  • 原文地址:https://www.cnblogs.com/Jiewl/p/12500658.html
Copyright © 2011-2022 走看看