这道题判断起来比较麻烦,需要分为几种情况进行讨论。
首先我考虑的是根据是否是叶子节点。如果是非叶子节点,那么下一个节点就是右子树中序遍历的第一个节点(也就是该节点右孩子的最底层左孩子,如果右孩子是叶子节点,那么就是右孩子)。如果是叶子节点,也要分为两种情况讨论,如果有父亲节点,且是父节点的左子树,那么下一个节点就是父节点;如果是父节点的右子树,那么下一个节点就需要递归父节点,直到某父节点是其父节点的左孩子。
在看完书以后,我发现这几种情况还可以再做抽象,首先如果一个节点有右子树,那么就可以根据非叶子节点的情况去考虑;如果一个节点没有右子树,那么就需要考虑它的父节点,然后再分为该节点是父节点的左孩子还是右孩子去讨论。讨论的结果和上面基本相同。
在编码时还需要注意判断需要查看的节点是否为空,如果未空,那就说明判断失败,直接返回 NULL 即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode==NULL) return NULL; if(pNode->right!=NULL){ TreeLinkNode* next=pNode->right; while(next->left!=NULL) next=next->left; return next; }else{ if(pNode->next!=NULL){ if(pNode==pNode->next->left){ return pNode->next; }else{ TreeLinkNode* parent=pNode->next; while(parent->next!=NULL){ if(parent==parent->next->left) return parent->next; parent=parent->next; } } } } return NULL; } };
|