剑指offer---二叉树的下一个结点

题目:二叉树的下一个结点

要求:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。

 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     {
16         
17     }
18 };

解题代码:

 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 == NULL)
16             return NULL;
17         TreeLinkNode* res = NULL;
18         TreeLinkNode* pCurrent = NULL;
19 
20         // 若右子树不为空,则右子树的最左节点即为指定节点的下一个节点
21         if(pNode->right != NULL){
22              pCurrent = pNode->right;
23             while(pCurrent->left != NULL){
24                 pCurrent = pCurrent->left;
25             }
26             res = pCurrent;
27         }
28         // 若右子树为空,且该节点为父节点的左子节点
29         else if(pNode->right == NULL && pNode->next != NULL && pNode->next->left == pNode){
30             res = pNode->next;
31         }
32         // 若右子树为空,且该节点为父节点的右子节点
33         else if(pNode->right == NULL && pNode->next != NULL && pNode->next->right == pNode){
34             pCurrent = pNode->next;
35             while(pCurrent->next != NULL && pCurrent->next->right == pCurrent)
36                 pCurrent = pCurrent->next;
37             res = pCurrent->next;
38         }
39         // 若右子树为空,且该节点根节点
40         else if(pNode->right == NULL && pNode->next == NULL)
41             return NULL;
42         return res;
43     }
44 };
原文地址:https://www.cnblogs.com/iwangzhengchao/p/9829012.html