Given a binary tree
struct TreeLinkNode { TreeLinkNode *left; TreeLinkNode *right; TreeLinkNode *next; }
Populate each next pointer to point to its next right node. If there is no next right node, the next pointer should be set to NULL
.
Initially, all next pointers are set to NULL
.
Note:
- You may only use constant extra space.
- You may assume that it is a perfect binary tree (ie, all leaves are at the same level, and every parent has two children).
For example,
Given the following perfect binary tree,
1 / 2 3 / / 4 5 6 7
After calling your function, the tree should look like:
1 -> NULL / 2 -> 3 -> NULL / / 4->5->6->7 -> NULL
题目含义:给定一个完全二叉树,从左到右连接每一层节点.
完全二叉树:所有叶子都在同一深度,每一个根节点都有两个叶子节点
方法一:
1 public void connect(TreeLinkNode root) { 2 // 由于是完全二叉树,所以若节点的左子结点存在的话,其右子节点必定存在,所以左子结点的next指针可以直接指向其右子节点,对于其右子节点的处理方法是,判断其父节点的next是否为空,若不为空,则指向其next指针指向的节点的左子结点,若为空则指向NULL 3 if (root ==null ) return; 4 if (root.left != null) root.left.next = root.right; 5 if (root.right!=null) root.right.next = root.next!=null?root.next.left :null; 6 connect(root.left); 7 connect(root.right); 8 }
方法二:会超时
1 public void connect(TreeLinkNode root) { 2 List<Integer> result = new ArrayList<>(); 3 if (root == null) return; 4 Queue<TreeLinkNode> q = new LinkedList<>(); 5 q.add(root); 6 while (!q.isEmpty()) { 7 int size = q.size(); 8 TreeLinkNode prev = null; 9 TreeLinkNode cur = null; 10 for (int i = 0; i < size - 1; i++) { 11 cur = q.poll(); 12 if (prev == null) { 13 prev = cur; 14 } else { 15 prev.next = cur; 16 prev = cur; 17 } 18 19 if (cur.left != null) q.offer(cur.left); 20 if (cur.right != null) q.offer(cur.right); 21 } 22 } 23 }