示例#1
0
 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;
 }
示例#5
0
        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);
                    }
                }
            }
        }
示例#6
0
        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();
        }