C++之《剑指offer》学习记录(12):二叉树的下一个节点

笔者最近在找工作时,无意间读到了一本名为《剑指offer》的书,粗略翻阅了一下,感觉这将会是一本能让我不再苦恼于笔试和面试“手搓代码”的书。故笔者写下该系列博客记录自己的学习历程,希望能和这本书的读者朋友们一起交流学习心得。
介绍:《剑指Offer:名企面试官精讲典型编程题(第2版)》剖析了80个典型的编程面试题,系统整理基础知识、代码质量、解题思路、优化效率和综合能力这5个面试要点。
编程题链接:牛客网在线编程_算法面试_面试必刷TOP101 (nowcoder.com)
本博客关键词:二叉树的下一个节点

题设

给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针。

本人解法:

class Solution {
  public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        if (pNode == nullptr) {
            return nullptr;
        }

        TreeLinkNode* p = pNode;

        // 根节点
        if (pNode->next == nullptr) {
            if (pNode->right == nullptr) {
                return nullptr;
            }
            p = pNode->right;
            while (p->left != nullptr) {
                p = p->left;
            }
            return p;
        }
        // 非根节点
        else {
            // 父节点的左子节点
            if (pNode == pNode->next->left) {
                // 无右子节点
                if (pNode->right == nullptr) {
                    return pNode->next;
                }
                // 有右子节点
                else {
                    p = pNode->right;
                    while (p->left != nullptr) {
                        p = p->left;
                    }
                    return p;
                }
            }

            // 父节点的右子节点
            else {
                // 无右子节点
                if (pNode->right == nullptr) {
                    while (p->next->next != nullptr) {
                        p = p->next;
                    }
                    if (p == p->next->left) {
                        return p->next;
                    } else {
                        return nullptr;
                    }
                }
                // 有右子节点
                else {
                    p = pNode->right;
                    while (p->left != nullptr) {
                        p = p->left;
                    }
                    return p;
                }
            }
        }

    }
};

官方解法:

class Solution {
  public:
    TreeLinkNode* GetNext(TreeLinkNode* pNode) {
        if (pNode == nullptr) {
            return nullptr;
        }

        TreeLinkNode* pNext = nullptr;
        if (pNode->right != nullptr) {
            TreeLinkNode* p = pNode->right;
            while (p->left != nullptr) {
                p = p->left;
            }
            pNext = p;
        } else if (pNode->next != nullptr) {
            TreeLinkNode* pCur = pNode;
            TreeLinkNode* pPar = pNode->next;
            while (pPar != nullptr && pCur == pPar->right) {
                pCur = pPar;
                pPar = pPar->next;
            }
            pNext = pPar;
        }
        return pNext;

    }
};

我的解法思路和官方的是差不多的,都是分类讨论然后遍历。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值