public TreeNodeWithNext(int data) { Data = data; Left = null; Right = null; Next = null; }
private void Connect(TreeNodeWithNext root) { if (root == null) return; Connect(root.Left, root); Connect(root.Right, root); Connect(root.Right); Connect(root.Left); }
private void Connect(TreeNodeWithNext current, TreeNodeWithNext parent) { if (current == null) return; if (current != parent.Right && parent.Right != null) { current.Next = parent.Right; } else { while (parent.Next != null) { parent = parent.Next; if (parent.Left != null || parent.Right != null) { current.Next = parent.Left == null ? parent.Right : parent.Left; break; } } } }
private TreeNodeWithNext ConnectRec(TreeNodeWithNext cur, TreeNodeWithNext parent) { if (parent != null && parent.Next != null) { while (parent.Next != null && parent.Next.Left == null && parent.Next.Right == null) { parent = parent.Next; } if (parent.Next != null) { if (parent.Next.Left != null) { cur.Next = parent.Next.Left; } else if (parent.Next.Right != null) { cur.Next = parent.Next.Right; } } } if (cur != null) { if (cur.Left != null && cur.Right != null) { cur.Left.Next = cur.Right; ConnectRec(cur.Right, cur); ConnectRec(cur.Left, null); } else if (cur.Left != null) { ConnectRec(cur.Left, cur); } else if (cur.Right != null) { ConnectRec(cur.Right, cur); } } return cur; }
private static void ConnectAtSameLevel(TreeNodeWithNext root) { if (root == null) { return; } Queue <TreeNodeWithNext> q = new Queue <TreeNodeWithNext>(); q.Enqueue(root); q.Enqueue(null); while (q.Count > 0) { TreeNodeWithNext current = q.Dequeue(); if (current != null) { current.Next = q.Peek(); if (current.Left != null) { q.Enqueue(current.Left); } if (current.Right != null) { q.Enqueue(current.Right); } } else { if (q.Count > 0) { q.Enqueue(null); } } } }
static void Main(string[] args) { TreeNodeWithNext root = new TreeNodeWithNext(1); var node2 = new TreeNodeWithNext(2); var node3 = new TreeNodeWithNext(3); var node4 = new TreeNodeWithNext(4); var node5 = new TreeNodeWithNext(5); var node6 = new TreeNodeWithNext(6); var node7 = new TreeNodeWithNext(7); root.Left = node2; root.Right = node3; node2.Left = node4; node2.Right = node5; node3.Left = node6; node3.Right = node7; ConnectAtSameLevel(root); Console.ReadLine(); }