问题陈述如下:
给定一个完美的二叉树,反转二叉树的交替层节点。
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/