[编程题] JZ57 二叉树的下一个节点

[编程题] JZ57 二叉树的下一个节点

题目描述

image-20200725170725222

参考

参考讲解

思路

主要根据中序遍历二叉树的特点:

  • 如果此节点有右子树,就循环找出该右子树的最深处的左子树。
  • 如果此节点无右子树,则返回的就应该是其父亲节点(这里存在一直往上返回其父节点。)

代码

/*
public class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}
*/
public class Solution {
    
    /*
    思路:根据二叉树的中序遍历特点:
    1、如果二叉树当前节点有右子树,那么返回的是当前节点的右子树的左子树
    2、如果当前节点无右子树(pNode=pNode.next.left),返回当前节点的父节点
    */
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode==null) {return null;}
        //1、如果二叉树当前节点有右子树,那么返回的是当前节点的右子树的左子树
        if(pNode.right!=null){
            pNode = pNode.right;
            while(pNode.left!=null){
                pNode = pNode.left;
            }
            return pNode;
        }
        
        //2、如果当前节点无右子树,返回当前节点的父节点
        while(pNode.next!=null){
            if(pNode.next.left==pNode){  //注意理解
                return pNode.next;
            }
            pNode = pNode.next;
        }
        
        //3 题目中其实最后一个中序遍历的节点是null的
        return null;
    }
}
原文地址:https://www.cnblogs.com/jiyongjia/p/13377412.html