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;
    		    }
    		}
    
  • 相关阅读:
    DP 免费馅饼 HDU1176
    知了课堂 Python Flask零基础 笔记整理
    Splay入门
    字典树
    榨取kkksc03 多维dp
    种族并查集总结
    倍增总结
    求最大公因数(辗转相除法&更相减损术)
    Bzoj 3036: 绿豆蛙的归宿(期望)
    Bzoj 1497: [NOI2006]最大获利(最小割)
  • 原文地址:https://www.cnblogs.com/Jiewl/p/12500658.html
Copyright © 2011-2022 走看看