劍指offer----二叉樹的下一個結點
阿新 • • 發佈:2018-12-14
題目描述 給定一個二叉樹和其中的一個結點,請找出中序遍歷順序的下一個結點並且返回。注意,樹中的結點不僅包含左右子結點,同時包含指向父結點的指標。
/* 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、當pNode為NULL,直接返回NULL //2、當pNode的右孩子不為空,則返回中序遍歷右子樹的第一個結點即可 //3、當pNode的右孩子為空時,則代表以pNode為根的子樹已經遍歷完成 // 返回到父節點,如果pNode是父節點的左孩子,則下一個遍歷結點就是 // 父節點,如果pNode是父節點的右孩子,則代表以pNode的父節點為根 // 的子樹已經遍歷完成,繼續向上尋找。(有可能父節點為空,代表整個樹 遍歷完成,也返回空值) class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode==NULL)return NULL; if(pNode->right==NULL) { if(pNode->next!=NULL&&pNode==pNode->next->left) return pNode->next; else if(pNode->next==NULL)return NULL; else { auto ptr=pNode; while(ptr->next!=NULL&&ptr==ptr->next->right) { ptr=ptr->next; } return ptr->next; } } else { TreeLinkNode* ptr=pNode->right; while(ptr->left!=NULL) { ptr=ptr->left; } return ptr; } } };