題目描述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; } };