面试题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;
		    }
		}
原文地址:https://www.cnblogs.com/Jiewl/p/12500658.html