2015-07-13 147 views
3

在C中編寫一個函數來創建一個新的BST,它是給定樹的鏡像。通過插入鏡像BST

我認爲針對此問題,其剛剛從原始樹複製的根節點,然後通過用DFS遍歷發現新的節點和將它們插入到新的鏡像樹與不同的比較函數進行的實現的(即在遍歷和插入節點時使用>代替<)。

我的問題是:這種方法在每種情況下都會起作用嗎?我這麼認爲,但我想知道是否存在我的解決方案無法工作的角落案例(或者有更好的解決方案)。

+0

另外:像在後 「開關左,右」訂單時尚肯定可以工作,但我很好奇,如果上述可以工作 –

+0

A,你的解決方案聽起來是對的。 B.你也可以將樹「讀」到一個數組中,在那裏交換(用一些數學算出什麼是交換的)並再次構建樹。這不是很節省內存,但應該很容易實現。 –

回答

2

遞歸解決方案:鏡像左側和右側的子項並將它們分別指定爲鏡像節點的右側和左側子項。下面的代碼(調用mirrorTree(根)執行):

class Node: 
    def __init__(self, val, left, right): 
    self.val=val 
    self.left=left 
    self.right=right 

def mirrorTree(node): 
    new_node=None 
    if node: 
    new_node=Node(node.val, mirrorTree(node.right), mirrorTree(node.left)) 
    return new_node 
+0

遞歸本質上是運行一個DFS,但爲簡明代碼+1 ... –

+0

大部分代碼是腳手架...算法的實際心臟可以寫成一個語句/表達式(帶遞歸調用的行) ! –

0

相同的答案爲Gen-YS只是在C.

node *create_empty() 
    { 
      node *temp = malloc(sizeof(*temp)); 
      temp->left = left; 
      temp->right = right; 
      return temp; 
    } 

    node *add_detail(int value, node *left, node *right) 
    { 
      temp->value = value; 
      temp->left = left; 
      temp->right = right; 
      return temp; 
    } 

    node *mirror(node *p) 
    { 
      if (p) { 
        node = create_empty(); 
        node = add_detail(p->value, mirror(p->right), mirror(p->left)); 
      } 
      return node; 
    }