访问下一个节点有两种情况,有右子树,就往右边遍历,其中假如左子树不为空就一直往左走,否则返回,没有左子树就直接返回。
情况二就是像图中左下角一样的没有右子树或者左右子树都没有就要找对应的没有遍历过得父节点,(if(parent->left==pNode)这说明刚好是符合要求的父节点,否则就要向上沿路找没有遍历过的父节点。
/*struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode==NULL){
return pNode;
}
if(pNode->right){
pNode=pNode->right;
while(pNode->left){
pNode=pNode->left;
}
return pNode;
}
while(pNode->next){
TreeLinkNode* parent=pNode->next;
if(parent->left==pNode){
return parent;
}
pNode=pNode->next;
}
return NULL;
}
};