public TreeNode2(int _val, TreeNode2 _left, TreeNode2 _right, TreeNode2 _next) { val = _val; left = _left; right = _right; next = _next; }
/// <summary> /// 给定一棵二叉树,返回它的自左向右同级连接 /// </summary> /// <param name="root"></param> /// <returns></returns> public TreeNode2 Connect2(TreeNode2 root) { Dictionary <int, TreeNode2> layersDict = new Dictionary <int, TreeNode2>(); DoRecursionByConnect2(root, 1, layersDict); return(root); }
/// <summary> /// 给定一棵perfect tree,要求自左向右连接它的同层 /// </summary> /// <param name="root"></param> /// <returns></returns> public TreeNode2 Connect(TreeNode2 root) { TreeNode2 doRoot = root; Queue <TreeNode2> doQueue = new Queue <TreeNode2>(); if (root != null) { doQueue.Enqueue(root); int loopNum = 1; while (doQueue.Count > 0) { TreeNode2 tmp1 = doQueue.Dequeue(); for (int i = 1; i < loopNum; i++) { TreeNode2 tmp2 = doQueue.Dequeue(); tmp1.next = tmp2; if (tmp1.left != null)//due to the defination { doQueue.Enqueue(tmp1.left); doQueue.Enqueue(tmp1.right); } tmp1 = tmp2; } if (tmp1.left != null) { doQueue.Enqueue(tmp1.left); doQueue.Enqueue(tmp1.right); } loopNum = loopNum << 1; } } return(root); }
private void DoRecursionByConnect2(TreeNode2 root, int depth, Dictionary <int, TreeNode2> layersDict) { if (root == null) { return; } if (!layersDict.ContainsKey(depth)) { layersDict.Add(depth, root); } else { layersDict[depth].next = root; layersDict[depth] = root; } DoRecursionByConnect2(root.left, depth + 1, layersDict); DoRecursionByConnect2(root.right, depth + 1, layersDict); }