(Java 剑指 offer)二叉树的下一个节点

一、题目解析

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

该题一共三种情况

(1)结点如果右孩子存在,则设置一个指针从该节点的右孩子出发,找到右孩子的最左结点即可。
(2)如果右孩子不存在,则判断是否存在父节点;如果该节点是父节点的左孩子节点则直接返回父节点,否则继续向上遍历其父节点的父节点,同时依次判断遍历的节点是否是父节点的左孩子节点。
(3)其余的情况返回空即可。

二、代码

public class Solution {
    
    
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
    
    
        //右孩子节点存在,则从右孩子节点开始找到最左结点
        if(pNode.right!=null){
    
    
            TreeLinkNode node = pNode.right;
            while(node.left!=null){
    
    
                node=node.left;
            }
            return node;
        }else if(pNode.right==null&&pNode.next!=null){
    
    
            //不存在右孩子节点,存在父节点
            TreeLinkNode node = pNode.next;
            while(node!=null){
    
    
                //判断该节点是否是父节点的左孩子
                if(node.left==pNode)
                    return node;
                pNode=node;
                node = node.next;
            }
        }
        return null;
    }
}

三、总结

注意第二种情况,需要依次判断该节点的父节点和其的关系,满足条件时返回即可。

猜你喜欢

转载自blog.csdn.net/nanhuaibeian/article/details/108616997