二叉树的下一个结点
下面是我在牛客网oj环境下编译测试通过的:
/*
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;
}
//接下来有两种情况:
//1:如果一个结点有右子树,那么它的下一个结点就是她的右子树的最左子结点
//2:如果一个结点没有右子树,分为两种情况
// 1:如果结点是它父节点左子树时,那么它的下一个结点就是它的父节点
// 2:如果节点是它父节点的右子树时,那么它的下一个节点是就是它的父节点的父节点的父节点,
//直到其中一个父节点是它父节点的左子结点的结点时
//pNode->next是pNode结点的父节点
if(pNode->right!=NULL)
{
pNode=pNode->right;
while(pNode->left!=NULL)
{
pNode=pNode->left;
}
return pNode;
}
while(pNode->next!=NULL)
{
TreeLinkNode* pParent=pNode->next;
if(pParent->left==pNode)
{
return pParent;
}
pNode=pNode->next;
}
return NULL;
}
};