給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指針。
/*
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
*/
// 分析問題:
// 1.當前節點如果是在左子樹上則有:
// 1.如果有右邊子樹,則下一個節點爲右子樹的最左節點
// 2.否則,向上找使得當前分支爲其左子樹的父親節點
// 2. 如果爲只有右子樹的節點,則返回爲空,說明爲最後一個節點
class Solution {
public:
TreeLinkNode* getRightLeft(TreeLinkNode* pNode) {
if (pNode->left == NULL) return pNode;
else return getRightLeft(pNode->left);
}
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == NULL) return NULL;
TreeLinkNode* t = NULL;
if(pNode->right !=NULL) {
return getRightLeft(pNode->right);
}
while(pNode->next != NULL) {
TreeLinkNode *q = pNode->next;
if(q->left == pNode) {
t = q;
break;
}
pNode = q;
}
return t;
}
};