二叉搜索树的第k个节点(java版)

来源:互联网 发布:手机端域名注册 编辑:程序博客网 时间:2024/06/07 05:43

【题目描述】给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。


【解题思路1】
//1. 二叉搜素树的中序遍历访问队列,自然的满足升序排序的条件。
//2. 中序遍历二叉搜索树,暂存输出队列。
//3. 从保存的输出队列中找到满足条件的值。

import java.util.ArrayList;public class Solution {    ArrayList<TreeNode> arr = new ArrayList<TreeNode>();    TreeNode KthNode(TreeNode pRoot, int k)    {        if(pRoot==null|| k==0){            return null;        }        inOrder(pRoot);        TreeNode tr = pRoot;        if(k<=arr.size()){            tr = arr.get(k-1);        }else{            return null;        }        return tr;    }    public void inOrder(TreeNode root){        if(root ==null){            return;        }        if(root.left != null){            inOrder(root.left);        }        arr.add(root);        if(root.right != null){            inOrder(root.right);        }    }}

【解题思路2】
//1. 改进思路1,不再暂存所有输出。
//2. 改为设置一个计数器。中序遍历过程中,累加计算访问过的节点数目,当计数器等于要求的k时,则返回该节点。

public class Solution {   int index = 0; //计数器    TreeNode KthNode(TreeNode root, int k)    {        if(root != null){ //中序遍历寻找第k个            TreeNode node = KthNode(root.left,k);            if(node != null)                return node;            index ++;            if(index == k)                return root;            node = KthNode(root.right,k);            if(node != null)                return node;        }        return null;    }}

【解题思路3】
//1. 中序遍历非递归

import java.util.Stack;public class Solution {    int count = 0;    TreeNode KthNode(TreeNode pRoot, int k)    {        if(count > k || pRoot == null)            return null;        TreeNode p = pRoot;        Stack<TreeNode> LDRStack = new Stack<TreeNode>();        TreeNode kthNode = null;        while(p != null || !LDRStack.isEmpty()){            while(p != null){                LDRStack.push(p);                p = p.left;            }            TreeNode node = LDRStack.pop();            System.out.print(node.val+",");            count++;            if(count == k){                kthNode = node;                break;            }            p = node.right;        }        return kthNode;    }}