這個問題基本上有兩種思路。
常規擴展:就字符串“A|B|C”而言,只需將其拆分並從樹的根節點開始逐層添加子節點。唯壹需要註意的是,在添加子節點之前,判斷當前搜索級別是否存在同名的節點(可能首先由其他字符串提供)。
回溯擴展:回溯是指調用自身,通常在方法級別。這個問題的叠代部分仍然是對單個字符串的分析,回溯可以像下面的偽代碼壹樣。還要註意重復節點的問題。
下面第壹段代碼是回溯偽代碼,第二段是使用常規擴展方法的歷史。
私人的?虛空?構建(TreeNode?currentRoot,字符串?模式訓練)
{
If(字符串中沒有|分隔符)?
為currentRoot添加最後壹個子節點,其文本為patternString。
其他
Foreach(每個模式字符串中的節點文本字符串)
{
為currentRoot添加壹個值為str的子節點;
CurrentRoot=上面的新節點;
NewPatternString=patternString截取未處理的部分(右側);
build(current root,newPatternString);
}
}
// -
公共的?班級?MyTreeView?:?樹形視圖
{
公共的?虛空?AddStringSource(IEnumerable & lt;字符串& gt?來源)
{
foreach?(var?v?在?來源)
AddStringSource(v);
}
公共的?虛空?AddStringSource(string?來源)
{
//基本思想是從左到右逐步拆解字符串,並在每壹步搜索樹中相應的節點。
//如果此節點不存在,請創建壹個新節點。這樣可以保證路徑的正確性,避免文本節點相同的問題。
TreeNode?當前節點?=?null
什麽時候?(來源。包含(“|”))
{
弦樂?firstSeg?=?來源。split(“|”)【0】;
TreeNode?子節點?=?新的?TreeNode(first seg);
如果?(當前節點?==?空)
{
//在樹的根節點集中找到指定的節點,如果不存在則創建壹個新節點。
TreeNode?搜索結果?=?text search(first seg,?current node);
如果?(搜索結果?==?空)
{
這個。Nodes.Add(子節點);
當前節點?=?子節點;
}
其他
當前節點?=?搜索結果;
}
其他
{
//在當前節點下查找指定節點(非空),如果不存在則創建新節點。
TreeNode?搜索結果?=?text search(first seg,?current node);
如果?(搜索結果?==?空)
{
當前節點。Nodes.Add(子節點);
當前節點?=?子節點;
}
其他
當前節點?=?搜索結果;
}
來源?=?來源。子串(來源。index of(‘|‘)+1);
}
當前節點。Nodes.Add(源);
}
私人的?TreeNode?TextSearch(字符串?文本,?TreeNode?節點)
{
如果?(節點?==?空)
{
foreach?(TreeNode?tn?在?這個。節點)
如果?(tn。短信?==?正文)
回歸?TN;
}
其他
foreach?(TreeNode?tn?在?節點。節點)
如果?(tn。短信?==?正文)
回歸?TN;
回歸?null
}
}
//呼叫部分
MyTreeView?mtv?=?新的?MyTreeView();
mtv。AddStringSource(新的?字符串【】?{?“A|B|C“,?“A|B|D“,?“A|E“、“F|G|H“、“F|G|I“、“F | G | H | J“});
這個。controls . Add(MTV);
mtv。碼頭?=?碼頭風格。填充;
mtv。ExpandAll();