- 首先这题是有两种变形的,第一种TreeNode包含一个指向父节点的指针,然后直接给你一个节点,然你给出其下一个终须遍历节点的位置:
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(!pNode)
return NULL;
if(pNode->right){
pNode = pNode->right;
while(pNode->left)
pNode = pNode->left;
return pNode;
}else{
while(pNode->next && pNode->next->left != pNode)
pNode = pNode->next;
return pNode->next;
}
}
};
- 还有一种是直接给你一个二叉树根节点t以及一个节点p,让你在二叉树中找出这个节点的下一个节点,如下所示:
/*
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
TreeNode(int x) :
val(x), left(NULL), right(NULL) {
}
};*/
class Successor {
private:
TreeNode * pre = new TreeNode(-1);
public:
int findSucc(TreeNode* root, int p) {
if(root == NULL)
return -1;
int curr = findSucc(root->left, p);
if(curr == -1){
if(p == pre->val)
return root->val;
pre = root;
return findSucc(root->right, p);
}
return curr;
}
};
class Successor {
private:
TreeNode * pre = new TreeNode(-1);
public:
int findSucc(TreeNode* root, TreeNode* p) {
if(root == NULL)
return NULL;
TreeNode * curr = findSucc(root->left, p);
if(curr == NULL){
if(p == pre)
return root;
pre = root;
return findSucc(root->right, p);
}
return curr;
}
};