1. 程式人生 > >《劍指offer》給定一顆二叉搜尋樹,請找出其中的第k大的結點。

《劍指offer》給定一顆二叉搜尋樹,請找出其中的第k大的結點。

題目:給定一顆二叉搜尋樹,請找出其中的第k大的結點。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按結點數值大小順序第三個結點的值為4。

解析:看到我寫的下面的程式碼,像一篇文章一樣的長,我也是醉了,先提交上去了。思想就是先來個層次遍歷二叉樹,得到所有的節點的值,然後再排序,取到第k大的節點的值。當然這個只是值,而不是節點,需要得到具體的節點資訊,我們需要再重新遍歷下該二叉樹,得到節點值為該值的節點,然後返回。

/*
public class TreeNode {
    int val = 0;
    TreeNode left = null;
    TreeNode right = null;

    public TreeNode(int val) {
        this.val = val;

    }
}
*/
import java.util.*; public class Solution { TreeNode KthNode(TreeNode pRoot, int k) { if(k==0){ return null; } List<Integer> list = new ArrayList<>();//存節點的值 Queue<TreeNode> queue = new LinkedList<>();//存節點 if(pRoot==null
){ return null; } queue.add(pRoot); int current =1; int next=0; while (!queue.isEmpty()){//層次遍歷二叉樹,然後得到所有節點的值 TreeNode node=queue.poll(); current--; list.add(node.val); if(node.left!=null){ queue
.add(node.left); next++; } if(node.right!=null){ queue.add(node.right); next++; } if(current==0){ current=next; next=0; } } Collections.sort(list);//給遍歷的二叉樹值的list排序,得到第k大的節點資訊 if(k>list.size()){ return null; } int num=list.get(k-1); queue.clear(); queue.add(pRoot); current=1; next=0; TreeNode result=null; while (!queue.isEmpty()){ TreeNode node=queue.poll(); current--; if(node.val==num){//找到第k大的節點資訊,然後返回 result=node; return result; } if(node.left!=null){ queue.add(node.left); next++; } if(node.right!=null){ queue.add(node.right); next++; } if(current==0){ current=next; next=0; } } return result; } }