颠倒完美二叉树的替换级别

时间:2016-08-29 01:08:46

标签: algorithm recursion tree

问题陈述是:

  

给定一个完美的二叉树,反转二叉树的交替级别节点。

Given tree: 
               a
            /     \
           b       c
         /  \     /  \
        d    e    f    g
       / \  / \  / \  / \
       h  i j  k l  m  n  o 

Modified tree:
               a
            /     \
           c       b
         /  \     /  \
        d    e    f    g
       / \  / \  / \  / \
      o  n m  l k  j  i  h 

来自this site的解决方案3提供了一种特别优雅的解决方案,它在树的偶数级别的节点上使用交换方法:void

preorder(struct Node *root1, struct Node* root2, int lvl)
{
    // Base cases
    if (root1 == NULL || root2==NULL)
        return;

    // Swap subtrees if level is even
    if (lvl%2 == 0)
        swap(root1->key, root2->key);

    // Recur for left and right subtrees (Note : left of root1
    // is passed and right of root2 in first call and opposite
    // in second call.
    preorder(root1->left, root2->right, lvl+1);
    preorder(root1->right, root2->left, lvl+1);
}

// This function calls preorder() for left and right children
// of root
void reverseAlternate(struct Node *root)
{
   preorder(root->left, root->right, 0);
}

出于某种原因,当打印树的原始版本和修改版本的顺序遍历时,它们会产生相同的输出:

Inorder Traversal of given tree
h d i b j e k a l f m c n g o 

Inorder Traversal of modified tree
h d i b j e k a l f m c n g o 

出于某种原因,该文章的作者并没有认识到这个问题,并将其作为最终解决方案,因为它是我假设的三种方法中最短的。帖子中的方法2更长,但它产生正确的输出。

解决方案是否存在导致两个版本的树的输出相同的错误?

1 个答案:

答案 0 :(得分:3)

  

解决方案是否存在导致两个版本的树的输出相同的错误?

算法没有错误。问题是main函数从不调用reverseAlternate(),所以它只是打印两次相同的树。

Add the missing call(链接中的第76行),它完美无缺。