给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
题意分析,分三种情况:
- 若该结点存在右结点,则该结点下一个结点为右子树的最左边的结点;
- 若该结点不存在右结点,且有父结点,是父节点的左结点,则下一个结点为该结点的父结点;
- 若该结点不存在右结点,有父结点,是父结点的右结点,则需要递归寻找以该结点父结点为左结点的结点;
/* 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 NULL; TreeLinkNode *pnext=NULL; if(pNode->right!=NULL) { while(pNode->right->left!=NULL) { pNode->right=pNode->right->left; } pnext=pNode->right; } else if(pNode->next!=NULL) { TreeLinkNode *pcurrent=pNode; TreeLinkNode *pparent=pNode->next; while(pparent!=NULL&&pcurrent==pparent->right) { pcurrent=pparent; pparent=pparent->next; } pnext=pparent; } return pnext; } };