【问题】给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
【思路】这道题目很坑人的就是parent指针不叫parent,叫做next, 也太奇葩了吧,不过无所谓啦,中序遍历的下一个节点主要分为两种情况:
情况一: 该节点存在右子树,则右子树的最左端的节点即为该节点的下一节点,我们遍历去寻找就可以了!
情况二: 该节点不存在右子树,则可以分成两种情况
1.如果该节点为右节点,那么需要一直向上遍历,直到找到某个节点是左节点,停止,则左节点的父节点为下一节点。
2.如果该节点为左节点,那么其父节点为下一节点!
/* struct TreeLinkNode { int val; struct TreeLinkNode *left; struct TreeLinkNode *right; struct TreeLinkNode *next; TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) { } }; */ class Solution { public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if(pNode == nullptr) return nullptr; TreeLinkNode* pNext = nullptr; if(pNode->right != nullptr) //情况一:有右子树 { TreeLinkNode* pRight = pNode->right; while(pRight->left != nullptr) pRight = pRight->left; //查找右子树的最左端节点 pNext = pRight; } else if(pNode->next != nullptr) //情况二:右子树为空 { TreeLinkNode *pCurrent = pNode; TreeLinkNode *pParent = pNode->next; while(pParent != nullptr && pCurrent == pParent->right) //2.1 右子树为空且该节点为右节点,则一直向上查找,直到该节点为父节点的左节点, //则该节点的父节点为下一节点 { pCurrent = pParent; pParent = pParent->next; } //2.2 右子树为空且为左节点,则父节点为下一节点 pNext = pParent; } return pNext; } };