2013-07-21 41 views
-1

我有這樣刪除/摺疊二叉樹PHP

---------------------------------- 
CUSTOMER_ID | REF_CUSTOMER_ID | 
---------------------------------- 
1    | NULL   | 
2    | 1    | 
3    | 2    | 
4    | 2    | 
5    | 3    | 
6    | 3    | 
7    | 4    | 
8    | 4    | 
9    | 1    | 
---------------------------------- 

從該表中已知的表2是1和3,4孩子的2等孩子.. 這使得樹看起來像這樣

   1 
       | 
     ------------------ 
     |    | 
     2    9 
     |    | 
    -----------  
    |  |     
    3  4 
    |  | 
    ----- ----- 
    | | | | 
    5 6 7 8 

沒關係,每個父後有2個孩子和4葉,在這種情況下2有3個和4葉5,6,7,8樹將要崩潰的孩子。這意味着它只會在樹中留下1。但是因爲2是1的孩子,3,4是1和1的葉子還沒有完成它的週期,所以1無法崩潰。

問題

如何我還是崩潰的2棵樹的根,但保持一個與它的孩子和葉子的樹?我如何解決這個問題?我必須創建另一個表嗎?或者只是使用現有的表?

僞代碼:

function deleteChildBranches(node) 
{ 
    get left and right child nodes 
    if(there's left branch node) 
     deleteANode(left branch node) 
    if(there's right branch node) 
     deleteANode(right branch node)  
} 

function deleteANode(node) 
{ 
    get left and right child nodes 
    if(there's left branch node) 
     deleteANode(left branch node) 
    if(there's right branch node) 
     deleteANode(right branch node) 
    delete this node 
} 

該代碼將首先遍歷樹的底部,節點被刪除

+2

你能解釋一下'collapse'是什麼意思嗎?我不明白你的問題......也許你可以張貼你想要樹最終看起來像什麼的圖表。 – SharkofMirkwood

+1

另外,3和4不是葉子。葉節點是沒有孩子的節點,但在本例中,3和4都有兩個孩子。 – SharkofMirkwood

+0

摺疊 - 意思是我想刪除其所有節點的樹。但在這種情況下,IF 2是一個根,整棵樹與2作爲ROOT必須崩潰。但是1作爲根還沒有完成一個循環,所以1不能崩潰。上圖中我知道3和4不是葉子。但是如果1是root並且你忽略了5678,那麼3和4是1的樹葉。循環只完成到樹的2級。這意味着你必須分別在2和1之間。但是在大樹結構中,兩者都是相互關聯的。 – Ridwan

回答

0

您不必使用額外的表,你可以使用遞歸刪除樹從底部到頂部。

+0

如果我這樣做了,2作爲ROOT的樹將從數據庫中刪除。正確。但是刪除2作爲ROOT之後,我想把2作爲1的CHILD來維護,因爲在圖9中的1的右邊的孩子沒有孩子,所以上圖中沒有設想崩潰。我想從root樹中刪除整個樹。但保持2作爲1的孩子。 – Ridwan

+0

我不知道你想達到什麼。但是我添加了一個不刪除開始刪除節點的功能。 – nio