关闭

剑指offer-二叉树的下一个结点

标签: 二叉树java
297人阅读 评论(0) 收藏 举报
分类:

题目描述

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

分析

二叉树的下一个节点,一共有以下情况:
1.二叉树为空,则返回空;
2.节点右孩子存在,则设置一个指针从该节点的右孩子出发,一直沿着指向左子结点的指针找到的叶子节点即为下一个节点;
3.节点不是根节点。如果该节点是其父节点的左孩子,则返回父节点;否则继续向上遍历其父节点的父节点,重复之前的判断,返回结果。

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)
    {
        // 1:判断是否为空
        if(pNode == null){
            return null;
        }

        // 2:判断是否有右子树,如果有,找到右子树中序遍历的第一个结点,即为所得节点。
        else if(pNode.right!=null){
            pNode=pNode.right;
            while(pNode.left!=null){
                pNode=pNode.left;
            }
            return pNode;
        }

        // 3:判断是否是根节点
        //  如果不是:判断是否是父节点的左子树,如果是,返回父节点;
        //  如果不是,继续向上遍历父节点,判断是否是父节点的左子树,直到根节点,如果找不到,返回null
        else{
            while(pNode.next!=null){
                if(pNode==pNode.next.left){
                    return pNode.next;
                }else{
                    pNode=pNode.next;
                }
            }
            return null;
        }
    }
}
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:75866次
    • 积分:2030
    • 等级:
    • 排名:第19933名
    • 原创:128篇
    • 转载:26篇
    • 译文:0篇
    • 评论:1条
    最新评论