剑指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 };