问题陈述是:
给定一个完美的二叉树,反转二叉树的交替级别节点。
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更长,但它产生正确的输出。
解决方案是否存在导致两个版本的树的输出相同的错误?
答案 0 :(得分:3)
解决方案是否存在导致两个版本的树的输出相同的错误?
算法没有错误。问题是main
函数从不调用reverseAlternate()
,所以它只是打印两次相同的树。
Add the missing call(链接中的第76行),它完美无缺。