public TreeNodeV2 Connect_BFS(TreeNodeV2 root)
        {
            var queue = new Queue <TreeNodeV2>();

            queue.Enqueue(root);

            while (queue.Count != 0)
            {
                var        nodeNumberInCurrLevel = queue.Count;
                TreeNodeV2 pre = null;
                while (nodeNumberInCurrLevel > 0)
                {
                    var node = queue.Dequeue();
                    if (node == null)
                    {
                        nodeNumberInCurrLevel--;
                        continue;
                    }

                    if (pre != null)
                    {
                        pre.next = node;
                    }

                    pre = node;
                    queue.Enqueue(node.left);
                    queue.Enqueue(node.right);
                    nodeNumberInCurrLevel--;
                }
            }

            return(root);
        }
Exemple #2
0
 public TreeNodeV2(int val,
                   TreeNodeV2 left,
                   TreeNodeV2 right,
                   TreeNodeV2 next)
 {
     this.val   = val;
     this.left  = left;
     this.right = right;
     this.next  = next;
 }
Exemple #3
0
        public static TreeNodeV2 BuildTreeV2(int?[] input,
                                             int i)
        {
            if (i >= input.Length || input[i] == null)
            {
                return(null);
            }

            var root = new TreeNodeV2(input[i].Value);

            root.left = BuildTreeV2(input,
                                    2 * i + 1);
            root.right = BuildTreeV2(input,
                                     2 * i + 2);

            return(root);
        }
Exemple #4
0
        public TreeNodeV2 Connect_DFS(TreeNodeV2 root)
        {
            if (root == null)
            {
                return(root);
            }

            var        temp = root.next;
            TreeNodeV2 nextNodeDownLevel = null;

            while (temp != null)
            {
                if (temp.left != null)
                {
                    nextNodeDownLevel = temp.left;
                    break;
                }

                if (temp.right != null)
                {
                    nextNodeDownLevel = temp.right;
                    break;
                }

                temp = temp.next;
            }

            if (root.left != null)
            {
                root.left.next = root.right ?? nextNodeDownLevel;
            }

            if (root.right != null)
            {
                root.right.next = nextNodeDownLevel;
            }

            Connect_DFS(root.right);
            Connect_DFS(root.left);

            return(root);
        }
        public TreeNodeV2 Connect_DFS(TreeNodeV2 root)
        {
            if (root == null)
            {
                return(null);
            }

            if (root.left != null)
            {
                root.left.next = root.right;
            }

            if (root.right != null && root.next != null)
            {
                root.right.next = root.next.left;
            }

            Connect_DFS(root.left);
            Connect_DFS(root.right);

            return(root);
        }
Exemple #6
0
        public static string GetNodeString(TreeNodeV2 root)
        {
            var queue             = new Queue <TreeNodeV2>();
            var nodeStr           = new List <string>();
            var firstNodeFromLeft = new List <TreeNodeV2>();

            if (root != null)
            {
                queue.Enqueue(root);
            }

            while (queue.Count != 0)
            {
                var nodeNumberInCurrLevel = queue.Count;
                var node = queue.Dequeue();
                firstNodeFromLeft.Add(node);

                if (node.left != null)
                {
                    queue.Enqueue(node.left);
                }

                if (node.right != null)
                {
                    queue.Enqueue(node.right);
                }

                nodeNumberInCurrLevel--;

                while (nodeNumberInCurrLevel > 0)
                {
                    node = queue.Dequeue();
                    if (node.left != null)
                    {
                        queue.Enqueue(node.left);
                    }

                    if (node.right != null)
                    {
                        queue.Enqueue(node.right);
                    }

                    nodeNumberInCurrLevel--;
                }
            }

            foreach (var item in firstNodeFromLeft)
            {
                var node = item;
                while (node != null)
                {
                    nodeStr.Add(node.val.ToString());
                    node = node.next;
                }

                nodeStr.Add("#");
            }

            return(string.Join(",",
                               nodeStr));
        }