题目描述

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

一 . 理解题意

该题目我们可以借鉴一个非常影响不好的例子来理解题意(重男轻女的思想,当然本人可不会这样,本人家庭更不会,从小被姐姐打成哈士奇)。

此外呢,该题目的关键点在于二叉树的遍历,其实这个已经说了好多次了,具体内容点这里。理解这个就好了,中序遍历嘛,就是左→根→右!

题目分析:我们把这个题目从一个“小家”出发,三个节点我们分别理解成(父节点--父母)、(左节点--儿子)、(右节点--闺女);而该节点的下一个节点我们可以理解成该节点向下一节点的索取位置。

所以呢,这个题目就可以从两个大方向,三个小方向出发了,分别是父母(父节点),孩子(儿子和女儿),所以啊,这个题目你在分析的时候一定要夹杂着重男轻女的思想。。

1. 站在苏大强和苏妈妈的角度,有明哲、明成、明玉三个孩子,两口子这么重男轻女,肯定不会向儿子索取东西,但是如果明玉有儿子,那么大强一定要先敲诈明玉的儿子一番(步骤2,女儿就算了,大强不忍心),如果没生儿子,那就会敲诈女儿明玉(步骤4,6,7),明玉,我要三室一厅。

2. 站在儿子的角度,比如啃老族明成,压根想都不用想,直接找老爹老妈要钱!!(步骤1,3)

3. 站在女儿明玉角度想,向父母索取压根没可能,就差把你卖了,所以呢,只能找那个可以管住你爹的爹的爹了(步骤5)。当然如果不存在了,就真的没法了,只能return null;(步骤8)了。

不知道这个例子合不合适,但是蛮好理解的,但是要记住,该题目是针对中序遍历!!!!!!!如果是前序或者后续就不可以这样想了,但是依然可以通过伦理性的思维去想,哈哈哈,不举例了,怕误人子弟。

二 . 代码实现

/*
public class TreeLinkNode
{
public int val;
public TreeLinkNode left;
public TreeLinkNode right;
public TreeLinkNode next;
public TreeLinkNode (int x)
{
val = x;
}
}*/
class Solution
{
public TreeLinkNode GetNext(TreeLinkNode pNode)
{
// write code here
//空值鲁棒判断
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)
{
//儿子啃老
if(pNode.next.left == pNode)
{
return pNode.next;
}
//孙女找祖宗
pNode = pNode.next;
}
//下个节点是空的时候,输出空
return null;
}
}

剑指Offer的学习笔记(C#篇)-- 二叉树的下一个节点(好理解版本)的更多相关文章

  1. 剑指offer第二版面试题7:二叉树的下一个节点(JAVA版本)

    题目:给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 分析: 根据中序遍历的特点,要找到一个节点的下一个节点无非 ...

  2. (剑指Offer)面试题58:二叉树的下一个结点

    题目: 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. 思路: 考虑中序遍历的过程, 如果当前结点存在右子节点, ...

  3. 剑指Offer的学习笔记(C#篇)-- 链表中倒数第K个点

    题目描述 输入一个链表,输出该链表中倒数第k个结点. 一 . 数据结构基础概念普及(线性表). 线性表可分为顺序表与链表,它们是堆栈.队列.树.图等数据结构的实现基础. 顺序表,线性表的顺序存储结构是 ...

  4. 剑指Offer的学习笔记(C#篇)-- 序列化二叉树

    题目描述 请实现两个函数,分别用来序列化和反序列化二叉树 一 . 理解题意 二叉树的序列化,是将一个结构化的东西变成扁平化的字符串,序列化二叉树或者是反序列化二叉树就是二叉树和扩展二叉树遍历序列之间的 ...

  5. 剑指Offer的学习笔记(C#篇)-- 反转链表

    题目描述 输入一个链表,反转链表后,输出新链表的表头. 一 . 概念普及 关于线性表等相关概念请点击这里. 二 . 实现方法 目前,可以有两种方法实现该要求. 方法一:借助外部空间实现.这里可以将单链 ...

  6. 剑指Offer的学习笔记(C#篇)-- 旋转数组的最小数字

    题目描述 把一个数组最开始的若干个元素搬到数组的末尾,我们称之为数组的旋转. 输入一个非减排序的数组的一个旋转,输出旋转数组的最小元素. 例如数组{3,4,5,1,2}为{1,2,3,4,5}的一个旋 ...

  7. 剑指Offer的学习笔记(C#篇)-- 和为S的连续正数序列

    题目描述 小明很喜欢数学,有一天他在做数学作业时,要求计算出9~16的和,他马上就写出了正确答案是100.但是他并不满足于此,他在想究竟有多少种连续的正数序列的和为100(至少包括两个数).没多久,他 ...

  8. 剑指Offer的学习笔记(C#篇)-- 数组中只出现一次的数字

    题目描述 一个整型数组里除了两个数字之外,其他的数字都出现了两次.请写程序找出这两个只出现一次的数字. 题目给定:num1,num2分别为长度为1的数组.传出参数:将  num1[0], num2[0 ...

  9. 剑指Offer的学习笔记(C#篇)-- 平衡二叉树(二叉树后序遍历递归详解版)

    题目描述 输入一棵二叉树,判断该二叉树是否是平衡二叉树. 一 . 题目分析 首先要理解一个概念:什么是平衡二叉树,如果某二叉树中任意的左右子树深度相差不超过1,那么他就是一颗平衡二叉树.如下图: 所以 ...

  10. 剑指Offer的学习笔记(C#篇)-- 二叉树的深度(详讲递归)

    题目描述 输入一棵二叉树,求该树的深度.从根结点到叶结点依次经过的结点(含根.叶结点)形成树的一条路径,最长路径的长度为树的深度. 一 . 思维发散 借助这个题目,我想用一个更好理解的方法说一说递归. ...

随机推荐

  1. empty blank

    非nil对象才能调用 empty nil: 对象是否存在empty: ”“ []blank: nil emptypresent: ! blank

  2. python的上下文管理器-1

    reference:https://zhuanlan.zhihu.com/p/26487659 来看看如何正确关闭一个文件. 普通版: def m1(): f = open("output. ...

  3. CI公用模型

    <?php if ( ! defined('BASEPATH')) exit('No direct script access allowed'); /** * SEO管理系统 -- 公用模型 ...

  4. sqlite:多线程操作数据库“database is locked”解决方法

    1. 使sqlite支持多线程(不确定是否非加不可,暂且加上,以备后患) 可以在编译时/启动时/运行时选择线程模式,参考:http://www.cnblogs.com/liaj/p/4015219.h ...

  5. 分享知识-快乐自己:Hibernate 关联映射

    关联关系映射--概念: 关联关系是使用最多的一种关系,非常重要.在内存中反映为实体关系,映射到DB中为主外键关系. 实体间的关联,即对外键的维护.关联关系的发生,即对外键数据的改变. 外键:外面的主键 ...

  6. MD5算法的简单编写

    package com.t_09; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; ...

  7. L94

    Early-morning births are genetically programmed THE notion that nothing good happens after midnight ...

  8. 64位 Windows 用了 32位编译平台 编译不过 MySQL API

    发生在一周前的事情了,当时想感受下 MySQL C API ,就写了几个小例子.虽然是在 Windows(我的工作电脑是 64位 Windows) 上面,但是不想用 VS ,只想用文本软件写好代码后用 ...

  9. Stop logging "internal dummy connection" in Apache

    Apache 2.x keeps child processes alive by creating internal connections which appear in the log file ...

  10. Java基础知识之常见关键字(1)

    static 特点: 随着类的加载而加载 优先于对象存在 被所有对象所共享 可以直接被类名调用 注意点: 静态方法只能访问静态方法 但是非静态成员可以直接访问静态成员 静态方法中不可以使用this , ...