问题陈述如下:
给定一个完美的二叉树,反转二叉树的交替层节点。

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提供了一个特别优雅的解决方案,其中它在树的偶数层的节点上使用了swap方法: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

出于某种原因,文章的作者没有认识到这个问题,而把它作为最终的解决方案,因为它是我假设的三种方法中最短的一种post中的方法2较长,但它产生正确的输出。
解决方案中是否存在导致树的两个版本的输出相同的错误?

最佳答案

解决方案中是否存在导致树的两个版本的输出相同的错误?
算法没有错误。错误在于main函数从不调用reverseAlternate(),因此它只打印同一棵树两次。
Add the missing call(链接中的第76行),它工作得很好。

关于algorithm - 反转理想二叉树的备用级别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39197268/

10-12 23:28