2015-07-13 96 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; 
    }