题目链接
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回 。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
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)//当结点是空时,返回nullreturn NULL;if(pNode->right)//当该结点有右子树,求右子树最左边的结点{pNode = pNode->right;while(pNode->left){pNode = pNode->left;}return pNode;}while(pNode->next)//当该结点没有右子树时,向上找第一个左链接指向的树包含该结点的祖先结点{if(pNode->next->left==pNode)return pNode->next;pNode = pNode->next;}return NULL;//当该结点是二叉树最右边的结点时,返回空}};
- 时间复杂度:最坏情况下为O(N)
- 空间复杂度:O(1)
