剑指offer:二叉树的下一个结点

  • 题目描述
    给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
/*
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)
    {
    }
};
  • 分析
    中序遍历的顺序为左根右,所以:
    1.一个结点如果有右子树,那么其右子树的左子结点就是它的下一个结点。(因为遍历到当前结点之后应当遍历其右子树,然后再右子树中依旧按照左根右的顺序,当然如果其右子树没有左子结点,那么下一个结点就是右子树的根结点)
    2.如果一个结点没有右子树,且该结点是其父结点的左子结点,那么它的下一个结点为其父结点;如果是父结点的右子结点,此时,我们需要向上遍历,直到找到一个结点是其父结点的子结点,当然如果这个父结点就是根结点,那么这个结点没有下一个结点,该二叉树中序遍历到这里就结束了。
    ps:上面结构体中的next结点应该指的是其父结点(不晓得为什么要这么写)
    例子:
          a
         / \
        b   c
       / \ / \
      d  e f  g
        / \
       h   i
          / \
         j   k

在上面的二叉树中,本身为左子结点的结点不提,对于结点e,有右子树,所以对右子树按照中序遍历,最开始的结点为j;而对于结点k,没有右子树,所以向上遍历,找到结点b是结点a的左子结点;而对于结点g,身为右子结点,且本身没有右子树,向上遍历又没有这样一个结点是其父结点的左子结点,因此g没有下一个结点。

  • 代码
/*
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;
        TreeLinkNode* pNext=NULL;
        if(pNode->right!=NULL){
            TreeLinkNode* pRight=pNode->right;
            while(pRight->left != NULL){
                pRight=pRight->left;
            }
            pNext=pRight;
        }else if(pNode->next!=NULL){
            TreeLinkNode* pCurrent=pNode;
            TreeLinkNode* pParent=pNode->next;
            while(pParent!= NULL && pCurrent==pParent->right){
                pCurrent=pParent;
                pParent=pParent->next;
            }
            pNext=pParent;
        }
        return pNext;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值