当前位置: 首页 > article >正文

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;

    }
};

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


http://www.kler.cn/a/409967.html

相关文章:

  • node.js路由
  • 香港大带宽服务器:助力高效网络应用
  • 15分钟做完一个小程序,腾讯这个工具有点东西
  • PCB元器件封装和3D库怎么找?
  • springboot/ssm企业车辆管理系统Java企业公交车辆信息管理平台web源码
  • 下载并安装Zsh
  • SD-WAN网络与自动化运维的结合
  • 线性代数在人工智能领域中的实践
  • 原批之星的南邮风云
  • 105.找到冠军
  • Linux中安装InfluxDB
  • 【蓝桥杯C/C++】深入解析I/O高效性能优化:std::ios::sync_with_stdio(false)
  • MQTT.fx连接oneNet中移IOT物联网平台,进行消息的发布的详细步骤
  • Matlab高光谱遥感、数据处理与混合像元分解技术
  • 重邮+数字信号处理实验二:系统响应及系统稳定性
  • Spring数据接收揭秘
  • windows C#-生成和使用异步流(下)
  • 具有多个表盘、心率传感器、指南针和游戏的 DIY 智能手表
  • 2024年跨行业跨领域工业互联网平台
  • 17.5k Star,ThingsBoard 一款开源、免费、功能全面的物联网 IoT 平台 -慧知开源充电桩平台