题目描述:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。
public class TreeNode {
int val = 0;
TreeNode left = null;
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
思路一:
中序遍历,即从小到大排序
import java.util.ArrayList;
public class Solution {
ArrayList<Integer> list = new ArrayList<>();
TreeNode KthNode(TreeNode pRoot, int k)
{
if (pRoot == null || k <= 0)
return null;
inorder(pRoot);
if (k > list.size())
return null;
return new TreeNode(list.get(k - 1));
}
private void inorder(TreeNode root)
{
if (root == null)
return;
inorder(root.left);
list.add(root.val);
inorder(root.right);
}
}
思路二:
中序遍历
public class Solution {
int index = 0;
TreeNode KthNode(TreeNode pRoot, int k)
{
if (pRoot != null)
{
TreeNode node = KthNode(pRoot.left, k);
if (node != null)
return node;
index++;
if (index == k)
return pRoot;
node = KthNode(pRoot.right, k);
if (node != null)
return node;
}
return null;
}
}
思路三:
中序遍历,非递归
import java.util.Stack;
public class Solution {
TreeNode KthNode(TreeNode pRoot, int k)
{
if (pRoot == null || k <= 0)
return null;
Stack<TreeNode> stack = new Stack<>();
int count = 0;
TreeNode node = pRoot;
while (node != null || !stack.isEmpty())
{
if (node != null)
{
stack.push(node);
node = node.left;
}
else
{
node = stack.pop();
count++;
if (count == k)
return node;
node = node.right;
}
}
return null;
}
}