1. 程式人生 > 實用技巧 >佇列和棧遍歷樹Mark一下

佇列和棧遍歷樹Mark一下

        /// <summary>
        /// 廣度遍歷樹,並給其編碼
        /// </summary>
        /// <param name="T"></param>
        void BFS(TreeNode T)
        {
            //呼叫先序遍歷方法給每個節點的過渡節點個數資訊賦初值
            preOrderTraverse(T);
            Queue queue = new Queue();
            queue.Enqueue(T);
            //所有節點應該不會超過20層吧哈哈哈
            int[] count = new int[20] { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
            while (queue.Count > 0)
            {
                TreeNode node = (TreeNode)queue.Dequeue();
                //關鍵步驟:計算當前節點所在層 在當前節點左邊有多少個節點
                count[node.Level]++;
                for (int i = 0; i < node.Nodes.Count; i++)
                {
                    queue.Enqueue(node.Nodes[i]);
                    if ((node.Tag as document_node_t).node_type_id > 20)
                        node.Nodes[i].ToolTipText = (int.Parse(node.Nodes[i].ToolTipText) + int.Parse(node.ToolTipText) + 1).ToString();
                    else
                        node.Nodes[i].ToolTipText = int.Parse(node.ToolTipText).ToString();
                }
                (node.Tag as document_node_t).node_number = (node.Level+1).ToString()+"-"+node.ToolTipText+"-"+(count[node.Level]).ToString();
                node.Text= (node.Level + 1).ToString() + "-" + node.ToolTipText + "-" + count[node.Level].ToString();
                //reportDao.updateNodeNumber((node.Tag as document_node_t).node_name, (node.Tag as document_node_t).node_number);
            }
        }

        void preOrderTraverse(TreeNode T)
        {
            Stack stack = new Stack();
            TreeNode p;
            stack.Push(T);
            //string s = "";
            while (stack.Count != 0)
            {
                p = (TreeNode)stack.Pop();
                //關鍵步驟:給每個節點的ToolTipText賦初值
                p.ToolTipText = "0";
                //s += (p.ToolTipText + "\n");
                if (p.NextNode != null)
                    stack.Push(p.NextNode);
                if (p.Nodes.Count > 0)
                    stack.Push(p.Nodes[0]);
            }
            //MessageBox.Show(s);
        }