时间限制:1秒
空间限制:32768K
热度指数:53602
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针
struct TreeLinkNode {
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
int val;
struct TreeLinkNode *left;
struct TreeLinkNode *right;
struct TreeLinkNode *next;
TreeLinkNode(int x) :val(x), left(NULL), right(NULL), next(NULL) {
}
};
这道题目感觉大家的思路都相同。
关键是分类讨论的条件:
1.是否为空树
2.右子树是否为空,为空则返回他的父结点,如果不为空,则找第一个右节点的最左子树,即为下一个结点;
3.第三种情况即在右子树了,如果是根节点的右子树,则是最后一个结点了,如果不是根节点的右子树,则从他的父结点开始寻找,直到某个父结点的父结点的左子树是父结点。(可能有点绕,程序里还会有进一步说明)
代码:
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){ //遍历该节点的父结点,直到找到某一组符合条件的节点(父结点的左子树是该节点)
TreeLinkNode* temp=pNode->next;
if(temp->left==pNode)
return temp;
pNode=pNode->next;
}
return NULL; //若父结点为空,则返回空,最后一个结点了
}
};
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){ //遍历该节点的父结点,直到找到某一组符合条件的节点(父结点的左子树是该节点)
TreeLinkNode* temp=pNode->next;
if(temp->left==pNode)
return temp;
pNode=pNode->next;
}
return NULL; //若父结点为空,则返回空,最后一个结点了
}
};