剑指offer第8题,本来想找leetcode上对应的题,后来没找到,直接去牛客网上刷了。

题目描述:

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

分析

我看到这道题的第一个想法,就是不用管左子树。因为中序遍历,左子树是之前访问过了,所以下一个节点只有两种可能。

一、在右子树

二、在父亲节点的部分

分情况讨论:

一、在右子树

如果右子树只有一个节点那还好说,那么下一个节点就是右子节点。但是如果右子树是一个树,那么就得看右子树的最左节点。

        TreeLinkNode * point=pNode->right;
while(point->left!=NULL)
{
point=point->left;
}
return point;

二、在父亲节点之上

若右子树为空,此时分两种情况。

(1)pNode是父亲节点的左子节点,那正好,下一个要访问的就是父亲节点,直接返回父亲节点就行;

(2)pNode是父亲节点的右子节点,说明下一个节点所在的区域,还至少在父亲节点的父亲节点之上。

我一开始绕了个远,第二种情况,我想到的是用递归解决。如果pNode是父亲节点的右子节点,那么就pNode=pNode->next;同时砍去父亲节点的右子树。这样就构造了一个子问题,把问题转换成了给定父亲节点之后,寻找访问下一个节点的问题。

        if(pNode->right==NULL)
{
if(pNode->next==NULL||pNode==pNode->next->left)
return pNode->next;
else{
pNode->next->right=NULL;
return GetNext(pNode->next);
}
}

说的有点绕,整体思想就是砍去右子树,让指针指向父亲,然后在新的树里,寻找指针指向的节点要访问的下一个节点。其实我个人觉得还挺巧妙的。

不过还是把简单问题复杂化了,其实直接一直往父亲寻找就行,直到找到满足情况(1)的pNode,返回pNode->next。

        if(pNode->right==NULL)
{
while(pNode->next!=NULL&&pNode!=pNode->next->left)
pNode=pNode->next;
return pNode->next;
}

最后放一下整体代码:

/*
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;
if(pNode->right==NULL)
{
while(pNode->next!=NULL&&pNode!=pNode->next->left)
pNode=pNode->next;
return pNode->next;
}
TreeLinkNode * point=pNode->right;
while(point->left!=NULL)
{
point=point->left;
}
return point; }
};

剑指offer-08 二叉树的下一个节点的更多相关文章

  1. 剑指offer——06二叉树的下一个节点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针.   题目的意思是,在一颗二叉树的中序遍历中,给出其中一 ...

  2. 【剑指Offer】二叉树的下一个结点 解题报告(Python)

    [剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...

  3. Go语言实现:【剑指offer】二叉树的下一个结点

    该题目来源于牛客网<剑指offer>专题. 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. Go语 ...

  4. 【Java】 剑指offer(7) 二叉树的下一个结点

    本文参考自<剑指offer>一书,代码采用Java语言.  更多:<剑指Offer>Java实现合集 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?  ...

  5. 剑指Offer 57. 二叉树的下一个结点 (二叉树)

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 题目地址 https://www.nowcoder.c ...

  6. [剑指Offer] 57.二叉树的下一个结点

    题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. /* struct TreeLinkNode { in ...

  7. [剑指Offer]8-二叉树的下一个节点

    链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...

  8. 【剑指offer】08二叉树的下一个节点,C++实现

    原创博文,转载请注明出处! # 题目 父节点指向子节点的指针用实线表示,从子节点指向父节点的指针用虚线表示. # 思路 如果节点有右子节点,则右子节点的最左节点是该节点的下一个节点.例如,寻找b的下一 ...

  9. 【剑指 Offer】08.二叉树的下一个节点

    题目描述 给定一颗二叉树和其中的一个节点,找出中序遍历序列的下一个节点.树中的节点除了有两个分别指向左右节点的指针,还有一个指向父节点的指针. Java public class Solution08 ...

  10. 剑指offer57:二叉树的下一个结点

    1 题目描述 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 2 思路和方法 中序遍历,下一个结点有两种情况 a ...

随机推荐

  1. Function.prototype.call.bind

    在JavaScript中借用方法 在JavaScript中,有时候需要在一个不同的对象上重用一个函数,而不是在定义它的对象或者原型中.通过使用call(),applay()和bind(),我们可以很方 ...

  2. MySQL实战45讲学习笔记:第二十六讲

    一.引子 在上一篇文章中,我和你介绍了几种可能导致备库延迟的原因.你会发现,这些场景里,不论是偶发性的查询压力,还是备份,对备库延迟的影响一般是分钟级的,而且在备库恢复正常以后都能够追上来. 但是,如 ...

  3. 官方一步解决各种Windows更新问题

    原文部分: 修复 Windows 更新问题 适用于: Windows 8.1Windows 10Windows 7   此分布指南有什么作用? 此分步指南提供的步骤可修复 Windows 更新的问题, ...

  4. Python 标准数据类型

    标准数据类型: Number(数字)----int float bool complex(复数) String(字符串) List(列表) Tuple(元组) Dictionary(字典) Set(集 ...

  5. Qt Quick 常用元素:TabView(选项卡) 与 Slider(滑块)

    一.TabView TabView 可以实现类似 Windows 任务管理器的界面,有人叫 TabView 为标签控件,有人又称之为选项卡控件,我们知道它就是这么个东西就行了.现在来介绍 TabVie ...

  6. laravel中如何执行请求

    laravel中如何执行request请求?本篇文章给大家介绍关于laravel中执行请求的方法,需要的朋友可以参考一下,希望对你有所帮助. 我们先来看一下request是什么? 客户端(例如Web浏 ...

  7. 第二十节:Asp.Net Core WebApi生成在线文档

    一. 基本概念 1.背景 使用 Web API 时,了解其各种方法对开发人员来说可能是一项挑战. Swagger 也称为OpenAPI,解决了为 Web API 生成有用文档和帮助页的问题. 它具有诸 ...

  8. Nginx 极简入门教程!

    上篇文章和大家聊了 Spring Session 实现 Session 共享的问题,有的小伙伴看了后表示对 Nginx 还是很懵,因此有了这篇文章,算是一个 Nginx 扫盲入门吧! 基本介绍 Ngi ...

  9. 阿里云 OSS 如何设置防盗链, 上个月图床流量耗费50G+,请求次数10W+,什么鬼?

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 高级架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  10. Java 线程的基本使用

    GitHub Page: http://blog.cloudli.top/posts/Java-线程的基本使用/ 创建线程 创建线程的方式有两种: 继承 Thread 类 实现 Runnable 接口 ...