给出一个二叉树和其中一个节点,找出按 前/中/后 顺序遍历的下一个节点并且返回。
给定树的图如下:
前序遍历:(根左右)
需要考虑的情况如下:
1、如果此时节点有左子节点,下一节点是左子节点。
2、如果此时节点无左子节点,但是有右子节点,下一节点是右子节点
3、如果此时节点无左右子节点,找其父节点,若此时是左子节点找的父亲,先判断父亲是否有右子节点,若有,返回右子节点,若无,此时父节点向爷节点发起向上循环;若此时是右子节点找的父节点,发起向上循环,即父节点-->儿子节点,爷爷节点--->父节点。
4、若以上都不成立,返回空。
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == NULL){
return NULL;
}
if(pNode->left != NULL){
return pNode->left;
}
if(pNode->right != NULL){
return pNode->right;
}
while(pNode->next!=NULL){
TreeLinkNode *proot = pNode->next;
if(proot->left==pNode)
if(proot->right!=NULL)
return proot->right;
else
pNode = pNode->next;
if(proot->right==pNode)
pNode = pNode->next;
}
return NULL;
}
};
中序遍历:(左根右)
需要考虑的情况如下:
1、如果此时节点有右子节点,那么下一个节点就是以右子节点为根且最左的点。例如,此时如果是D,那么下一个就是N;
2、如果此时节点是叶子节点,且是其父亲右孩子,那么下一个节点就需要遍历它父亲,依次循环重复判断。例如,如果此时是J,那么下一个就是A;
3、如果此时节点是叶子节点,且是其父亲左孩子,那么下一个节点就是他父亲。例如,如果此时是I,那么下一个就是E;
4、如果二叉树为空,返回空。
class Solution {
public:
TreeLinkNode* GetNext(TreeLinkNode* pNode)
{
if(pNode == NULL){
return NULL;
}
if(pNode->right!=NULL){
pNode=pNode->right;
while(pNode->left!=NULL)
pNode=pNode->left;
return pNode;
}
while(pNode->next!=NULL){
TreeLinkNode *proot = pNode->next;
if(proot->left==pNode)
return proot;
pNode = pNode->next;
}
return NULL;
}
};
后序遍历:左右根
1、左子节点找父节点问有没有右兄弟,若有,返回右兄弟;否则,返回父节点;
2、右子节点返回父亲节点。