博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
剑指offer(60):二叉树的下一个节点
阅读量:4287 次
发布时间:2019-05-27

本文共 1722 字,大约阅读时间需要 5 分钟。

题目描述

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

分析

二叉树的中序遍历结构是“左根右”的顺序。要定位一个节点的而下一个节点有3中情况需要考虑:

结构如图:虚线表示指向父节点的指针。

包含指向父节点指针的二叉树

  1. 如果一个节点具有右子树,则它的下一个节点就是它的右子树中的最左子节点。例如,a的下一个节点是f,b的下一个节点是h。
  2. 如果一个节点没有右子树并且它是父亲节点的左子节点,则它的下一个节点就是父亲节点。例如,d的洗衣歌节点是b,f的下一个节点是c。
  3. 如果一个节点没有右子树并且它是父亲节点的右子节点,则比较复杂:需要沿着父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点。如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点。 例如i的下一个节点是a。

牛客AC:

/*public class TreeLinkNode {    int val;    TreeLinkNode left = null;    TreeLinkNode right = null;    TreeLinkNode next = null;    TreeLinkNode(int val) {        this.val = val;    }}*/public class Solution {
public TreeLinkNode GetNext(TreeLinkNode pNode) { if (pNode == null) return null; TreeLinkNode pNext = null; // 需要寻找的下一个节点 if (pNode.right != null) { // 当前节点有右子树,它的下一个节点就是它的右子树中的最左子节点 TreeLinkNode pRight = pNode.right; while (pRight.left != null) // 寻找右子树中的最左子节点 pRight = pRight.left; pNext = pRight; } else if (pNode.next != null) { TreeLinkNode pCurrent = pNode; TreeLinkNode pParent = pNode.next; // 当前节点没有右子树,是父亲节点的左子节点,它的下一个节点就是父亲节点。 if (pParent != null && pCurrent == pParent.left) pNext = pParent; else { // 当前节点没有右子树,是父亲节点的右子节点: // 沿着父节点指针一直向上遍历,找到一个是它父节点的左子节点的节点。 // 如果这样的节点存在,那么这个节点的父节点就是我们要找的下一个节点。 while (pParent != null && pCurrent == pParent.right) { pCurrent = pParent; pParent = pParent.next; } pNext = pParent; } } return pNext; }}

参考

1. 何海涛,剑指offer名企面试官精讲典型编程题(纪念版),电子工业出版社

你可能感兴趣的文章
VisualSVN Server搭建SVN服务器
查看>>
AngularJs directive指令详解
查看>>
AngularJs directive-scope
查看>>
AngularJs directive-link实例
查看>>
Js实现Base64编码、解码
查看>>
AngularJs directive-scope双向绑定方法处理-实例2
查看>>
AngularJs Ajax分页控件
查看>>
LocalDB数据库修改排序规则,修复汉字变问号
查看>>
C# Json序列化工具--Newtonsoft.Json简介和使用
查看>>
EntityFramework中Json序列化的循环引用问题解决--Newtonsoft.Json
查看>>
AngularJs----ng-class
查看>>
VS调试版本和发布版本
查看>>
VSCode前端编辑器 1.7(编辑功能媲美sublime text,HTML等代码格式化很是不错)
查看>>
VsCode插件整理
查看>>
VSCode插件之View In Browser/Open in Browser‘在浏览器中查看’
查看>>
Web前端代码编辑器之Atom整理
查看>>
Atom编辑器之JS代码只能补全插件-Atom-ternjs
查看>>
VisualStudio2017相关说明整理
查看>>
VisualStudio2017相关说明整理(二)
查看>>
.Net 官方学习文档
查看>>