[剑指offer][Java]二叉树的下一个节点

题目

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

程序核心思想

如果这个节点的右孩子不为空,那么它的下一个节点一定在它的右子树上,所以再检查它的右子树,返回它右子树的最左的节点(如果有的话),否则返回右子树的根节点。
如果这个节点的右孩子为空,那么检查它是否是它父节点的右节点,如果不是(那就是它父节点的左节点),那么返回它的父节点;如果是(它父节点的右节点),那么返回让它指向它的父节点,再次做同样的检查(是否是它父节点的右节点),直到他的父节点为空,那么意为着题目给出的这个节点是整棵树的最右的节点,则返回null。

Tips

在做pNode == pNode.next.right这种一个指针后面还有指针的操作时,要保证第一个不为空指针,方法可以是pNode.next != null && pNode == pNode.next.right。

代码

/*
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;
        
        while(true){
            if(pNode.right != null){
                pNode = pNode.right;
                while(pNode.left != null){
                    pNode = pNode.left;
                }
                return pNode;
            }else{
                while(pNode.next != null  && pNode == pNode.next.right){
                    pNode = pNode.next;
                }
                if(pNode.next == null || pNode.next == pNode){
                    return null;
                }
                return pNode.next;
            }
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一些概念 数据结构就是研究数据的逻辑结构和物理结构以及它们之间相互关系,并对这种结构定义相应的运算,而且确保经过这...
    Winterfell_Z阅读 6,020评论 0 13
  • 1.树和二叉树的定义 (1) 树的定义 树是n (n≥0) 个结点的有限集。 n=0 时称为空树。在任意一棵非空树...
    yinxmm阅读 2,496评论 0 3
  • 1. 二叉树的深度 分析:如果一棵树只有一个结点,它的深度为1。否则树的深度就是其左、右子树深度的较大值再加1。 ...
    HungerDeng阅读 543评论 0 0
  • 以此文记录学习 数据结构-树 的相关知识,以备后续回顾复习。 一、树 定义: 树(Tree)是n(n>=0)个结点...
    逐日追星看月亮阅读 587评论 0 0
  • 要学习红黑二叉树,就得先了解二叉树是什么,二叉树是有限个元素得集合,这些元素集合构成树,二叉树允许集合元素个数为0...
    huwei30阅读 1,425评论 0 0