/* * 117. Populating Next Right Pointers in Each Node II * 2016-7-18 by Mingyang * 唯一的不同是每次要先找到一个第一个有效的next链接节点,并且递归的时候要先处理右子树,再处理左子树。 * 主要的思路还是一样的,从上到下依次populate数据,唯一不同的是需要找到第一个孩子不为空的next节点 * 这样的话才能找到,先进行root左边,再右边的找 * 先右子树再左子树,重要的事情要说三遍!!!!! */ public void connect1(TreeLinkNode root) { if (root == null) return; //如果右孩子不为空,左孩子的next是右孩子。 //反之,找root next的至少有一个孩子不为空的节点 if (root.left != null) { if (root.right != null) { root.left.next = root.right; } else { TreeLinkNode p = root.next; while (p != null && p.left == null && p.right == null) p = p.next; if (p != null) root.left.next = p.left == null ? p.right : p.left; } } //右孩子的next 根节点至少有一个孩子不为空的next if (root.right != null) { TreeLinkNode p = root.next; while (p != null && p.left == null && p.right == null) p = p.next; if (p != null) root.right.next = p.left == null ? p.right : p.left; } connect1(root.right); connect1(root.left); } //自己的代码,写的不错。思路一样 public void connect3(TreeLinkNode root) { if(root==null) return; if(root.right!=null){ TreeLinkNode p=root.next; while(p!=null){ if(p.left==null&&p.right==null) p=p.next; else{ root.right.next=p.left==null?p.right:p.left; break; } } } if(root.left!=null){ if(root.right!=null){ root.left.next=root.right; }else{ TreeLinkNode p=root.next; while(p!=null){ if(p.left==null&&p.right==null) p=p.next; else{ root.left.next=p.left==null?p.right:p.left; break; } } } } connect3(root.right); connect3(root.left); }