给定一个 完美二叉树 ,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {int val;Node *left;Node *right;Node *next;}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。
初始状态下,所有 next 指针都被设置为 NULL。

参考前序遍历二叉树的实现
public static TreeNode connectNode(TreeNode node) {// 递归的结束条件if (node == null || node.left == null) {// 终止时处理办法return null;}// 当前节点需要做的事情nodeNeedTodo(node);// 让当前节点的左子节点重复当前节点connectNode(node.left);// 让当前节点的右子节点重复当前节点connectNode(node.right);return node;}/*** 让左子节点指向右子节点*/private static void nodeNeedTodo(TreeNode node) {node.left.next = node.right;}
测试验证
public static void main(String[] args) {Integer[] arr = {4,2,7,1,3,6,9};TreeNode root = BinaryTreeUtil.arrToTree(arr);root = connectNode(root);BinaryTreeUtil.levelOrderPrintNext(root);}
4-->null 2-->7 7-->null 1-->3 3-->null 6-->9 9-->null
正确的节点需要做的事
private static void nodeNeedTodo(TreeNode node1, TreeNode node2) {node1.next = node2}
正确的算法
public static TreeNode connectNode(TreeNode node) {if (node == null) {return null;}connectNode(node.left, node.right);return node;}private static void connectNode(TreeNode node1, TreeNode node2) {if (node1 == null || node2 == null) {return;}// 需要节点做的事情nodeNeedTodo(node1, node2);// 相同父节点// 左子树的左子节点指向右子节点connectNode(node1.left, node1.right);// 右子树的左子节点指向右子节点connectNode(node2.left, node2.right);// 跨父节点// 左子树的右子节点指向右子树的左子节点connectNode(node1.right, node2.left);}
测试验证
public static void main(String[] args) {Integer[] arr = {4,2,7,1,3,6,9};TreeNode root = BinaryTreeUtil.arrToTree(arr);root = connectNode(root);BinaryTreeUtil.levelOrderPrintNext(root);}
4-->null 2-->7 7-->null 1-->3 3-->6 6-->9 9-->null
树节点对象
public class TreeNode {int val;TreeNode left;TreeNode right;TreeNode next;TreeNode(){}TreeNode(int val) {this.val = val;}TreeNode(int val, TreeNode left, TreeNode right) {this.val = val;this.left = left;this.right = right;}}
辅助工具类
/*** 层序遍历打印* @param node*/public static void levelOrderPrintNext(TreeNode node) {if (node == null) {return;}LinkedList<TreeNode> linkedList = new LinkedList<>();linkedList.add(node);while (!linkedList.isEmpty()) {TreeNode temp = linkedList.remove();if (temp.next == null) {System.out.print(temp.val + "-->" + temp.next + " ");} else {System.out.print(temp.val + "-->" + temp.next.val + " ");}if (temp.left != null) {linkedList.add(temp.left);}if (temp.right != null) {linkedList.add(temp.right);}}}
