今天学习的是上篇算法的升级版:填充每个节点的下一个右侧节点指针Ⅱ。
题目介绍
给定任意一个二叉树,填充它的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
网友评论