题目描述:
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
分析:
- 如果该结点存在右子树,那么返回右子树的最左结点。
- 如果该结点不存在右子树,那么如果该结点不是其父结点的最右结点,那么返回父结点;
否则一直找到最大子树的最右结点是该结点,那么返回该最大子树的根结点的父结点。
代码:
1 /* 2 struct TreeLinkNode { 3 int val; 4 struct TreeLinkNode *left; 5 struct TreeLinkNode *right; 6 struct TreeLinkNode *next; 7 TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { 8 9 } 10 }; 11 */ 12 class Solution { 13 public: 14 TreeLinkNode* GetNext(TreeLinkNode* pNode) { 15 if(pNode->right == NULL) { 16 if(pNode->next == NULL) return NULL; 17 TreeLinkNode* p1 = pNode; 18 TreeLinkNode* p2 = pNode->next; 19 while(p2 && p2->right == p1) { 20 p1 = p1->next; 21 p2 = p1->next; 22 } 23 if(p2) return p2; 24 return NULL; 25 } 26 TreeLinkNode* nextNode = pNode->right; 27 while(nextNode->left) { 28 nextNode = nextNode->left; 29 } 30 return nextNode; 31 } 32 };