二叉树的下一个节点

    给出一个二叉树和其中一个节点,找出按 前/中/后 顺序遍历的下一个节点并且返回。

    给定树的图如下:

    前序遍历:(根左右)

            需要考虑的情况如下:

                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、右子节点返回父亲节点。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值