當前位置:成語大全網 - 書法字典 - 劈開它並把它放進字典裏。

劈開它並把它放進字典裏。

妳說的“回調”是指“回溯”嗎?回溯(叠代)和回調(委托反向調用)是兩碼事。

這個問題基本上有兩種思路。

常規擴展:就字符串“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();