【发布时间】:2018-03-23 06:23:41
【问题描述】:
我一直在研究一个基本上应该打印我在程序中的二叉树的函数,但我遇到了问题。树是动态的,值是数字,更大的新数字将在右侧添加,较小的在左侧。
基本上树的打印方式是这样的: 假设只有值为 3 的根,那么输出将是:
(3)
添加值为 2 的节点后:
((2)<(3))
我得到的输出:
(((2))<(3))
加8后:
((2)<(3)>(8))
我得到的输出:
(((2))<(3)>((8))))
加7后:
((2)<(3)>((7)<(8)))
我得到的输出:
(((2))<(3)>(((7))<(8)))
等等…… 请注意,第一个节点根具有不同的结构,因此分为 2 种情况。
主要问题是括号太多了。
这是我目前写的代码:
void PrintTree(Root* root, Node* currentNode,Boolean isFirst) {
if (root == NULL)
return;
else if (root->right == NULL && root->left == NULL) {
root->PrintObject(root->value);
printf("\n");
} else {
printf("(");
if (isFirst == TRUE) {
if (root->left != NULL) {
PrintTree(root,root->left, FALSE);
printf("<");
}
root->PrintObject(root->value);
if (root->right != NULL) {
printf(">");
PrintTree(root,root->right, FALSE);
}
} else {
if (currentNode->left != NULL) {
PrintTree(root,currentNode->left, FALSE);
printf("<");
}
root->PrintObject(currentNode->value);
if (currentNode->right != NULL) {
printf(">");
PrintTree(root,currentNode->right, FALSE);
}
}
printf(")");
}
return;
}
void PrintObject(void* value) {
printf("(%d)", *(int*)value);
return;
}
将不胜感激任何形式的帮助。 谢谢!
【问题讨论】:
-
root->PrintObject(...)看起来不对。您也可以通过使用类型 Node 作为根节点来简化一切。 -
嘿,我不明白 root->PrintObject() 有什么问题?
-
啊,对不起,我错过了关于得到太多括号的句子。 (好吧,
root->PrintObject不应该在C中编译,除非Root包含一个成员PrintObject,它是一个指向函数的指针,我真的不知道它是否是。没关系。)你能提供一个您获得的输出与您需要的输出的示例? -
代码上面已经提供了,我举了几个例子。
-
我必须先学会正确阅读。对不起。因此,如果我的想法正确,您的代码会为叶节点(即没有子节点的节点)打印额外的括号。我建议不要打印这些括号。您已经有一个条件可以处理根节点 (
root->left==NULL && root->right==NULL) 的这种情况,但它对其他节点没有帮助。只需为 currentNode 添加一个类似的。
标签: c recursion tree binary-tree