鱼C论坛

 找回密码
 立即注册
查看: 108|回复: 5

用递归构建二叉树

[复制链接]
发表于 2024-12-31 14:49:50 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 萌兰 于 2024-12-31 16:00 编辑

1
1000051503.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-12-31 14:50:18 | 显示全部楼层
这个问题涉及到打印二叉树的格式化输出。代码中`printTree`函数是按照某种格式(类似横向的树状结构)打印二叉树:

1. **逆时针旋转原因**:代码中的`printTree`函数在打印时,选择先打印右子树,然后再打印当前节点值,最后打印左子树。因此,打印结果会像一棵横着放的树,根节点在左侧,右子树在上面,左子树在下面。从视觉角度看,这就像是顺时针旋转90度的树形结构。

2. **空格控制**:
   - `printTree`函数通过`level`参数控制空格的数量。`level`表示当前递归调用的深度。
   - 每递归深入一个层级(即遍历到更深的子树),就会加深缩进,这个缩进是用空格来表示的。
   - 通过`for`循环打印`level`个空格,这样可以确保不同深度的节点在输出时能够对齐。

3. **最后一个节点为`null`的情况**:当遍历到一个子树的叶子节点时,继续深入其左/右子树都会遇到`NULL`。此时`printTree`函数打印的就是`null`。由于最终的树一般会有一些`NULL`子节点,这些`null`会出现在树的底部,对应于空的树叶。

总结:通过`printTree`函数的设计,二叉树被横着打印,而且`null`对应于叶子节点为空的子树。通过`level`控制输出的空格数,以保证不同节点之间的正确缩进。这个过程使得树形结构按一定的格式打印出来。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-31 14:59:14 From FishC Mobile | 显示全部楼层
FishC 发表于 2024-12-31 14:50
这个问题涉及到打印二叉树的格式化输出。代码中`printTree`函数是按照某种格式(类似横向的树状结构)打印 ...

如果我想它正过来,应该怎么改
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-31 14:59:47 | 显示全部楼层
萌兰 发表于 2024-12-31 14:59
FishC 发表于 2024-12-31 14:50
这个问题涉及到打印 ...


如果想让二叉树按照标准树形结构(根节点在上,左子树在左,右子树在右)打印,可以调整`printTree`函数的递归顺序。需要先打印左子树,再打印当前节点值,最后打印右子树,并适当增加缩进。以下是简要的修改思路:
// 打印二叉树(文本格式)
void printTree(TreeNode* node, int level) {
    if (node == NULL) {
        for (int i = 0; i < level; ++i) {
            printf("   "); // 打印缩进
        }
        printf("null\n");
        return;
    }

    // 先打印左子树
    printTree(node->left, level + 1);

    // 打印当前节点值,并加上适当的缩进
    for (int i = 0; i < level; ++i) {
        printf("   ");
    }
    printf("%d\n", node->val);

    // 再打印右子树
    printTree(node->right, level + 1);
}

这样修改后,打印出来的结果会按照从上到下,从左到右进行顺序输出,树形结构会更符合平常所见的样子。注意在输出的每一层前加上适当数量的空格,以确保每层的缩进是合适的。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-12-31 15:05:48 From FishC Mobile | 显示全部楼层
FishC 发表于 2024-12-31 14:59
如果想让二叉树按照标准树形结构(根节点在上,左子树在左,右子树在右)打印,可以调整`printTree`函 ...

还是老样子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-12-31 15:23:52 | 显示全部楼层
萌兰 发表于 2024-12-31 15:05
FishC 发表于 2024-12-31 14:59
如果想让二叉树按照 ...


如果您希望打印的树形结构是根节点在上,左子树在左,右子树在右,可以考虑改用另一种格式并保持输出的一致性。尽量通过打印左右子树之间的关系来达到这种显示效果。以下是调整方向的`printTree`函数:
// 打印二叉树(标准格式)
void printTree(TreeNode* node, int level) {
    if (node == NULL) {
        for (int i = 0; i < level; ++i) {
            printf("   "); // 打印缩进
        }
        printf("null\n");
        return;
    }

    // 打印适当的缩进
    for (int i = 0; i < level; ++i) {
        printf("   ");
    }
    // 打印当前节点值
    printf("%d\n", node->val);
    
    // 先打印左子树
    printTree(node->left, level + 1);

    // 再打印右子树
    printTree(node->right, level + 1);
}

在这种格式中,每一层节点在打印时都会先打印出当前节点,然后递归打印其左子树,再打印右子树。这样你会得到一棵标准的树形输出。调整空格可以更好地体现层级关系。

此外,请确保控制台配置足够宽,以适当的字体和窗口大小来查看树结构。由于每行都会分配额外空格以表示层级,所以整棵树可能会变宽。

可以尝试执行代码查看效果,看是否符合要求。如果输出方式仍无法满足需求,可以考虑用图形编程库或者更复杂的格式化输出形成图形化表示。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-2-5 19:58

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表