USE tempdb -- or your own test database CREATE TABLE Employees ( empid int NOT NULL, mgrid int NULL, empname varchar(25) NOT NULL, salary money NOT NULL, CONSTRAINT PK_Employees PRIMARY KEY(empid), CONSTRAINT FK_Employees_mgrid_empid FOREIGN KEY(mgrid) REFERENCES Employees(empid) ) CREATE INDEX idx_nci_mgrid ON Employees(mgrid)WITH EmpCTE(empid, empname, mgrid, lvl) AS ( -- Anchor Member (AM) SELECT empid, empname, mgrid, 0 FROM Employees WHERE empid = 7 UNION ALL -- Recursive Member (RM) SELECT E.empid, E.empname, E.mgrid, M.lvl+1 FROM Employees AS E JOIN EmpCTE AS M ON E.mgrid = M.empid ) SELECT * FROM EmpCTE
我自己写了一下,显示了一下其它都正确,但在最后一个节点不停循环,好象是递归错误的问题。请大家帮忙看一下好吗? public void DFS(TreeNode tr, System.Collections.ArrayList arlist) { System.Console.WriteLine("DFS:TreeNodeName:{0},TreeFatherNodeName:{1},TreeInformation:{2}", tr.TreeNodeName, tr.TreeFatherNodeName, tr.TreeInformation); tr.bVisit = true; //arlist.Remove(tr); TreeNode[] trees = this.FindChildNode(tr); if (trees != null) { while (trees.Length > 0) { for (int j = 0; j <= trees.Length - 1; j++) { st.Push((object)trees[j]);
} if (st.Count >0) { TreeNode tnode=(TreeNode)st.Pop();
用with 关键字。进行递归join
CREATE TABLE Employees
(
empid int NOT NULL,
mgrid int NULL,
empname varchar(25) NOT NULL,
salary money NOT NULL,
CONSTRAINT PK_Employees PRIMARY KEY(empid),
CONSTRAINT FK_Employees_mgrid_empid
FOREIGN KEY(mgrid)
REFERENCES Employees(empid)
)
CREATE INDEX idx_nci_mgrid ON Employees(mgrid)WITH EmpCTE(empid, empname, mgrid, lvl)
AS
(
-- Anchor Member (AM)
SELECT empid, empname, mgrid, 0
FROM Employees
WHERE empid = 7
UNION ALL
-- Recursive Member (RM)
SELECT E.empid, E.empname, E.mgrid, M.lvl+1
FROM Employees AS E
JOIN EmpCTE AS M
ON E.mgrid = M.empid
)
SELECT * FROM EmpCTE
public void DFS(TreeNode tr, System.Collections.ArrayList arlist)
{ System.Console.WriteLine("DFS:TreeNodeName:{0},TreeFatherNodeName:{1},TreeInformation:{2}", tr.TreeNodeName, tr.TreeFatherNodeName, tr.TreeInformation);
tr.bVisit = true;
//arlist.Remove(tr);
TreeNode[] trees = this.FindChildNode(tr);
if (trees != null)
{
while (trees.Length > 0)
{
for (int j = 0; j <= trees.Length - 1; j++)
{
st.Push((object)trees[j]);
}
if (st.Count >0)
{
TreeNode tnode=(TreeNode)st.Pop();
DFS(tnode, arlist);
}
}
}
else
{
if (st.Count > 0)
{
TreeNode trnode = (TreeNode)st.Pop();
DFS(trnode, arlist);
}
} }
节点含有节点名,父节点名,是否被浏览这几信息。