佇列和棧遍歷樹Mark一下
阿新 • • 發佈:2020-08-08
/// <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); }