二叉树--链接每个节点的下一个右侧节点Ⅱ

今天学习的是上篇算法的升级版:填充每个节点的下一个右侧节点指针Ⅱ。

题目介绍

给定任意一个二叉树,填充它的next节点,指向下一个右侧节点,最右侧节点指向null。

看下图吧:


二叉树-填充每个节点的下一个右侧节点指针Ⅱ-题目.png

实现思路

直接看下图吧:


二叉树-填充每个节点的下一个右侧节点指针Ⅱ-解题.png

题目的解题思路和满二叉树的是类似的。

核心的逻辑是:
1、右节点不为空时,左节点的next为右节点;右节点为空时,左节点的next为父节点的next节点的左节点。依此类推,直到为null为止。
2、右节点和左节点是一样的逻辑。

实现代码

public class Node {
    public int val;
    public Node left;
    public Node right;
    public Node next;

    public Node() {
    }

    public Node(int _val) {
        val = _val;
    }

    public Node(int _val, Node _left, Node _right, Node _next) {
        val = _val;
        left = _left;
        right = _right;
        next = _next;
    }
}
public class SolutionConnect2 {

    public Node connect(Node root) {
        if (null == root) {
            return null;
        }

        if (null != root.left) {
            if (null != root.right) {
                root.left.next = root.right;
            } else{
                root.left.next = connectRightNext(root);
            }
            connect(root.left);
        }

        if (null != root.right) {
            root.right.next = connectRightNext(root);
            connect(root.right);
        }
        return root;
    }

    private Node connectRightNext(Node root){
        Node next = root.next;
        while (null != next) {
            if (null != next.left) {
                next = root.left;
                break;
            } else if (null != next.right) {
                next = next.right;
                break;
            }
            next = next.next;
        }
        return next;
    }

}

算法相关实现源码地址:https://github.com/xiekq/rubs-algorithms

你可能感兴趣的:(二叉树--链接每个节点的下一个右侧节点Ⅱ)