天天看點

二叉搜尋樹的第k個節點

二叉搜尋樹的第k個節點

給定一棵二叉搜尋樹,請找出其中的第k小的TreeNode結點。

二叉搜尋樹是右節點的val比左節點的val大。

關于·二叉樹的題目,首先肯定會想到遞歸方法,是以遞歸寫法就是:

import java.util.*;
public class Solution {
    ArrayList<TreeNode> list=new ArrayList<>();
   //這裡寫一個中序周遊的方法,将整個樹通過遞歸放入list中
    void addNode(TreeNode cur){
        if(cur!=null){
                addNode(cur.left);
            list.add(cur);
            addNode(cur.right);
        }
    }
    TreeNode KthNode(TreeNode pRoot, int k) {
        if(pRoot==null||k<=0) return null;
        addNode(pRoot);
        //将樹放入list中
       if(k>0&&list.size()>=k){
       //直接擷取k-1個元素,因為list是從0開始的,是以第k小就是k-1個
            return list.get(k-1);
            
       }
        return null;
    }
 
 
}

           

非遞歸的方法:

import java.util.*;
public class Solution {
    TreeNode KthNode(TreeNode pRoot, int k) {
        if(pRoot==null||k<=0) return null;
        Stack<TreeNode> stack=new Stack<>();
        TreeNode cur=pRoot;
        while(!stack.isEmpty()||cur!=null){
            if(cur!=null){
            //前序周遊,将樹的節點放入棧中
                stack.push(cur);
                cur=cur.left;
            }else{
            //cur為null就去放他的右節點
                cur=stack.pop();
                 
                if(--k==0){//計數,彈出第k個就是我們所需要的節點
                    return cur;
                }
                cur=cur.right;
            }
        }
        return null;
    }
 
 
}