二叉搜索樹的第K大節點

題目描述this

給定一顆二叉搜索樹,請找出其中的第k大的結點。spa

分析code

對二叉搜索樹進行逆向中序遍歷(先右再左),則遍歷序列是降序排序的,所以中序遍歷一顆二叉搜索樹,能夠很容易的獲得它的第k大的節點。使用一個計數器變量,每遍歷一個節點,計數器加1,當計數器的值等於k時,root節點即爲所求節點。blog

解法一:保存遍歷過的節點,計算其數量。排序

public class Solution {  
    vector<TreeNode> vec;  
     TreeNode KthNode(TreeNode pRoot, int k)  
    {  
        if(k == 0 ) return null;  
               zhongxu(pRoot);  
        if(k > vec.size()) return null;      
        return vec.get(k-1);  
    }  
     void zhongxu(TreeNode pRoot){  
                if(pRoot == null) return ;  
                zhongxu(pRoot.right);  
                vec.push_back(pRoot);  
                zhongxu(pRoot.left);  
    }  
  
} 

解法二:利用遞歸的返回值,判斷是否結束。遞歸

class Solution {
    int count = 0;
public:
    TreeNode* KthNode(TreeNode* pRoot, unsigned int k)
    {
        if(pRoot){ 
                TreeNode *ret = KthNode(pRoot->right, k);   //若是是葉子節點,到這裏返回。而後記數
                if(ret) return ret;
                count++;   //this ++ because root is not null
                if(count == k)
                    return pRoot;
                ret = KthNode(pRoot->left,k);  //路徑是先右後左
                if(ret) return ret;
        }
        return nullptr;
    }
};
相關文章
相關標籤/搜索