117. Populating Next Right Pointers in Each Node II

来源:互联网 发布:java商城开发视频教程 编辑:程序博客网 时间:2024/05/17 01:56

Follow up for problem "Populating Next Right Pointers in Each Node".

What if the given tree could be any binary tree? Would your previous solution still work?

Note:

  • You may only use constant extra space.

For example,
Given the following binary tree,

         1       /  \      2    3     / \    \    4   5    7

After calling your function, the tree should look like:

         1 -> NULL       /  \      2 -> 3 -> NULL     / \    \    4-> 5 -> 7 -> NULL


空间O(1)版本

http://www.2cto.com/kf/201311/259258.html

public static void connect(TreeLinkNode root) {          // 空节点就直接返回          if (root == null){              return;          }                     // 找到与root同一行的next node          TreeLinkNode rootNext = root.next;          TreeLinkNode next = null;       // 下一个被连接的对象                     // rootNext如果是null说明已经处理完这一层的所有node          // next不等于null说明找到了找到最左边的下一个被连接的对象          while (rootNext != null && next == null)          {              if (rootNext.left != null){ // 优先找左边                  next = rootNext.left;              } else{                  next = rootNext.right;              }              rootNext = rootNext.next;          }              if (root.left != null)          {              if (root.right != null){    //  内部相连                  root.left.next = root.right;              }else{                      // 跨树相连                  root.left.next = next;              }          }          if (root.right != null){        // 跨树相连              root.right.next = next;          }                     connect(root.right);        // 要先让右边都先连起来          connect(root.left);      }  


另外一种层次遍历的方法,最坏情况空间O(N/2)

public void connect(TreeLinkNode root){if(root==null)return ;ArrayDeque<TreeLinkNode> deque=new ArrayDeque<>();deque.add(root);int level=1;TreeLinkNode pre=null;boolean levelchang=true;while(!deque.isEmpty()){TreeLinkNode t=deque.poll();if(t.left!=null)deque.add(t.left);if(t.right!=null)deque.add(t.right);if(!levelchang)pre.next=t;level--;if(level==0){levelchang=true;level=deque.size();}else {levelchang=false;}pre=t;}}


0 0
原创粉丝点击