题目链接
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回 。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
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)//当结点是空时,返回null
return 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)