利用队列和栈实现树型结构历遍时间:2022-04-16 12:37:22 /**/ /// <summary> /// 广度优先 /// </summary> /// <param name="control"></param> private void FindSelecedControl1(Control control) { Queue que = new Queue(); Control ctlCurrent; que.Enqueue(control); while(que.Count != 0) { ctlCurrent = (Control)que.Dequeue(); // 最先加入队列的节点出列 if(true) // 访问之 { if(ctlCurrent.ID != null) aList.Add(ctlCurrent.ID); } for(int i = 0; i < ctlCurrent.Controls.Count; i++) // 把ctlCurrent的子节点入列 { que.Enqueue(ctlCurrent.Controls[i]); } } } /**/ /// <summary> /// 深度优先 /// /// </summary> /// <param name="control"></param> private void FindSelecedControl(Control control) { Stack stk = new Stack(); Control ctlCurrent = control; // 当前访问的控件 Control ctlParent = null; // 父控件 int index = 0; // 当前控件是父控件的第i个子控件 do { if(true) // 判断当前控件(ctrCurrent)是不是要找的 { if(ctlCurrent.ID != null) aList.Add(ctlCurrent.ID); } if(ctlCurrent.Controls.Count != 0) // 访问完当前控件,优先访问子控件 { stk.Push(index); //发现子,current = parent.controls[index].将index推入棧 index = 0; ctlParent = ctlCurrent; ctlCurrent = ctlCurrent.Controls[0]; } else if(ctlParent != null && index + 1 < ctlParent.Controls.Count) // 存在下一个兄弟控件 { ctlCurrent = ctlParent.Controls[++index]; } else // 没有子控件和下一个兄弟控件 { while(true) { if(ctlParent == null || ctlParent.Equals(control)) { ctlCurrent = control; break; } ctlCurrent = ctlParent; ctlParent = ctlCurrent.Parent; index = (int)stk.Pop(); if(ctlParent != null && index + 1 < ctlParent.Controls.Count) { ctlCurrent = ctlParent.Controls[++index]; break; } } } }while(!ctlCurrent.Equals(control)); }