解題思路 :
先解決 root == nullptr 的問題 直接回傳 root
之後判斷兩種狀況
p 點有 right child:
這種情形 inorder 的下一個 successor 必須是 right child 子樹的最小值 ( 最左下層 )p 點沒有 right child:
此時要檢查是否有 parent 並且此 parent 的值要比 p 大 ( 這樣 p 才會是 parent 的 left child ) 在 inorder 中如果 p 為 left child 那 parent 就會是下一個出列
C++ code :
<pre><code>
TreeNode* findMin(TreeNode* p)
{
while(p->left != nullptr)
{
p = p->left;
}
return p;
}
class Solution {
public:
TreeNode* inorderSuccessor(TreeNode* root, TreeNode* p) {
// write your code here
if(root == nullptr) return root;
//target has a right child
if(p->right != nullptr) return findMin(p->right);
//target has no right child
TreeNode *parent = nullptr;
TreeNode *tmp = root;
while(tmp != p)
{
if(p->val < tmp->val)
{
parent = tmp;
tmp = tmp->left;
}
else tmp = tmp->right;
}
return parent;
}
};