剑指offer:二叉树的下一个节点

一、题目描述:
二、解题思路(分三种情况):
    1. 如果当前结点有右子树
    2. 如果当前节点没有右子树
        (1) 如果当前节点是它父节点的左子节点
        (2)如果当前节点是它父节点的右子节点
三、代码实现:

在这里插入图片描述1. 如果当前结点有右子树

下一个节点就是它的右子树的最左子节点(从右子节点出发一致沿着指向左子节点的指针,即可找到)
如:b ——》h, a——》f
2. 如果当前节点没有右子树
(1) 如果当前节点是它父节点的左子节点
下一个节点就是它的父节点
如:d——》b, f——》c, h——》e

(2)如果当前节点是它父节点的右子节点
沿着指向父节点的指针一直向上遍历,直到找到一个是它父节点的左子节点的节点,如果这样的节点存在,那么这个节点的父节点就是我们要找到的下一个节点
如:i节点的下一个节点:沿着指向父节点的指针向上遍历,先到e,e是b的右子节点,不是,继续向上遍历,到b, b是a的左子节点,因此节点b的父节点a就是i的下一个节点

如:g节点的下一个节点:沿着指向父节点的指针向上遍历,先到c, c是a的右子节点,不是,继续向上遍历到a, a是根节点,无父节点,因此g没有下一个节点。

给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父
结点的指针。
链接:https://www.nowcoder.com/questionTerminal/9023a0c988684a53960365b889ceaf5e?f=discussion
来源:牛客网

public class Solution {
    TreeLinkNode GetNext(TreeLinkNode node)
    {
        if(node==null) return null;
        if(node.right!=null){    //如果有右子树,则找右子树的最左节点
            node = node.right;
            while(node.left!=null) node = node.left;
            return node;
        }
        while(node.next!=null){ //没右子树,则找第一个当前节点是父节点左孩子的节点
            if(node.next.left==node) return node.next;
            node = node.next;
        }
        return null;   //退到了根节点仍没找到,则返回null
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章