剑指Offer 57. 二叉树的下一个结点 (二叉树)
题目描述
给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。
题目地址
思路
三种情况
1)当前结点有右子树。当前结点的下一结点是右子树中的最左子结点,如node=8,它的下一结点为12.
2)当前结点无右子树,且当前结点是其父结点的左孩子。下一结点为当前结点的父结点,如node=8,它的下一个结点为12。
3)当前结点无右子树,且当前结点是其父结点的右孩子。则一直向上遍历,直到找到最靠近的一个祖先节点pNode且pNode是其父节点的左子节点,那么输入节点的下一个结点就是pNode的父节点。如node=14,它的下一个结点为16.
Python
# -*- coding:utf-8 -*-
class TreeLinkNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None
self.next = None
node1 = TreeLinkNode(1)
node2 = TreeLinkNode(2)
node3 = TreeLinkNode(3)
node4 = TreeLinkNode(4)
node5 = TreeLinkNode(5)
node1.left = node2
node1.right = node3
node3.left = node4
node4.right = node5
node2.next = node1
node3.next = node1
node4.next = node3
node5.next = node4
class Solution:
def GetNext(self, pNode):
# write code here
pNext = None
# 如果以下都不满足返回空
if not pNode:
pNext = pNode
if pNode.right:
# 如果当前结点有右子树,则下一结点在右子树的最下左结点
pNode = pNode.right
while pNode.left:
pNode = pNode.left
pNext = pNode
else:
if pNode.next and pNode == pNode.next.left:
# 如果当前结点有父结点并且当前结点是父结点的左子结点,下一结点为父结点
pNext = pNode.next
elif pNode.next and pNode == pNode.next.right:
# 如果当前结点有父结点并且当前结点是父结点的右子结点,向上遍历
pNode = pNode.next
while pNode.next and pNode == pNode.next.right:
pNode = pNode.next
# 当遍历到当前结点为父结点的左子结点时,输入结点的下一个结点为当前结点的父结点
if pNode.next:
pNext = pNode.next
return pNext if __name__ == '__main__':
result = Solution().GetNext(node1)
剑指Offer 57. 二叉树的下一个结点 (二叉树)的更多相关文章
- [剑指Offer]8-二叉树的下一个节点
链接 https://www.nowcoder.com/practice/9023a0c988684a53960365b889ceaf5e?tpId=13&tqId=11210&tPa ...
- 【Java】 剑指offer(7) 二叉树的下一个结点
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点? ...
- Go语言实现:【剑指offer】二叉树的下一个结点
该题目来源于牛客网<剑指offer>专题. 给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回. 注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针. Go语 ...
- 【剑指Offer】二叉树的下一个结点 解题报告(Python)
[剑指Offer]二叉树的下一个结点 解题报告(Python) 标签(空格分隔): 剑指Offer 题目地址:https://www.nowcoder.com/ta/coding-interviews ...
- 剑指offer:JZ8 二叉树的下一个结点
JZ8 二叉树的下一个结点 描述 给定一个二叉树其中的一个结点,请找出中序遍历顺序的下一个结点并且返回.注意,树中的结点不仅包含左右子结点,同时包含指向父结点的next指针.下图为一棵有9个节点的二叉 ...
- 【剑指offer】面试题 8. 二叉树的下一个结点
面试题 8. 二叉树的下一个结点 NowCoder 题目描述 给定一棵二叉树和其中的一个结点,如何找出中序遍历顺序的下一个结点?树中的结点除了有两个分别指向左右子结点的指针以外,还有一个指向父结点的指 ...
- 剑指Offer(二十四):二叉树中和为某一值的路径
剑指Offer(二十四):二叉树中和为某一值的路径 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.ne ...
- 力扣 - 剑指 Offer 57. 和为s的两个数字
题目 剑指 Offer 57. 和为s的两个数字 思路1(哈希表) 这题首先想到的是使用两个for遍历,查找是哪两个相加等于target,但是时间复杂度确实\(O(N^2)\),时间复杂度太高,因此我 ...
- 力扣 - 剑指 Offer 57 - II. 和为s的连续正数序列
题目 剑指 Offer 57 - II. 和为s的连续正数序列 思路1(双指针/滑动窗口) 所谓滑动窗口,就是需要我们从一个序列中找到某些连续的子序列,我们可以使用两个for循环来遍历查找,但是未免效 ...
- 剑指 Offer 57 - II. 和为s的连续正数序列 + 双指针 + 数论
剑指 Offer 57 - II. 和为s的连续正数序列 Offer_57_2 题目描述 方法一:暴力枚举 package com.walegarrett.offer; /** * @Author W ...
随机推荐
- Redis学习-hash数据类型
hash 类型是string类型的field和value的映射表,或者说是一个string集合,适合存储对象,相比较而言,将一个对象类型存储在hash类型里要比存储在string类型里占用更少的内存空 ...
- RXD, tree and sequence IN HDU6065
解这道题绕了好多弯路...先是把"depth of the least common ancestor"这句话忽视掉,以为是最深点与最浅点的深度差:看到某人题解(的开头)之后发现自 ...
- CSS 标签选择器
CSS 标签选择器 再<stype>标签内,通过指定输入标签来配置CSS样式 <html> <head> <!-- style 设置头部标签--> &l ...
- Docker Weave 命令整理
Docker Weave 命令整理 # 查看weave状态 weave status # 查看状态详情 weave status connections # 查看weave相互之间节点建立的关系 we ...
- AFNetworking的简单使用
AFNetworking的下载地址: https://github.com/AFNetworking/AFNetworking AFNetworking的使用非常简单,创建一个类,调用一个方法就可以达 ...
- kettle 连接 SQL Server 异常
场景重现 新安装的 kettle(pdi-ce-7.0.0.0-25) 连接 SQL Server 2012 时报错如下: 解决办法 到 https://sourceforge.net/project ...
- CMS GC启动参数优化配置
简介: java启动参数共分为三类: 其一是标准参数(-),所有的JVM实现都必须实现这些参数的功能,而且向后兼容: 其二是非标准参数(-X),默认jvm实现这些参数的功能,但是并不保证所有jvm实现 ...
- yum downloadonly模式,保存所需软件及其依赖包
command: sudo yum install --downloadonly --downloaddir='yourderictory'
- JavaScript闭包函数&箭头函数调用与执行
一.标准的闭包函数 //一.标准的闭包函数 function A() { var i=0; ++i; console.log('i : ' + i); return function b() { re ...
- Android外包团队——Jquery乱码解决方案
最近使用jQuery遇到中文乱码问题,其实他的中文乱码就是因为contentType没有指定编码,只需在jQuery.js中搜索’contentType’ 然后在application/x-www-f ...