weixin_43894905 2024-04-23 00:07 采纳率: 20%
浏览 2

定义函数递归打印二叉树为什么要参数不等于NULL

img


定义函数递归打印二叉树为什么要参数不等于NULL
putchar的参数是NULL的话会直接停止打印吗

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-23 00:07
    关注

    引自免费微信小程序:皆我百晓生

    在C++中,当我们定义一个递归函数来遍历并打印二叉树时,通常我们会使用两个主要参数:一个是二叉树的根节点(通常是Node* root),另一个是用于表示当前层级的空格数(例如int space)。这里我们关注的是根节点的参数。

    参数不等于NULL的原因在于,二叉树中的每个节点可能有两个子节点:左子节点和右子节点。在递归过程中,我们需要分别处理这两个子节点。当一个节点为NULL时,这意味着它没有子节点,因此递归应该终止。这就是为什么我们在调用函数处理子节点之前检查根节点是否为NULL。如果根节点为NULL,那么就不执行对这个子节点的递归操作,而是直接返回,这样就保证了递归过程的正确性。

    举个例子,考虑下面的二叉树:

          1
         / \
        2   3
       / \   
      4   5 
    

    为了实现层次遍历,我们可以定义一个名为printLevelOrder的函数,接受根节点和当前层级的空格数作为参数。以下是完整的代码示例:

    #include<iostream>
    using namespace std;
    
    // 定义二叉树节点结构体
    struct Node {
        int data;
        Node* left;
        Node* right;
    };
    
    // 创建新节点
    Node* newNode(int data) {
        Node* node = new Node();
        node->data = data;
        node->left = nullptr;
        node->right = nullptr;
        return node;
    }
    
    // 打印二叉树的层次遍历
    void printLevelOrder(Node* root, int space) {
        if (root == nullptr) { // 如果节点为空,则结束递归
            return;
        }
    
        // 打印当前节点值,并添加相应层级的空格
        for (int i = 0; i < space; ++i) {
            cout << " ";
        }
        cout << root->data << endl;
    
        // 递归处理左子树和右子树
        printLevelOrder(root->left, space + 4); // 增加4个空格,代表下一层级
        printLevelOrder(root->right, space + 4);
    }
    
    int main() {
        Node* root = newNode(1);
        root->left = newNode(2);
        root->right = newNode(3);
        root->left->left = newNode(4);
        root->left->right = newNode(5);
    
        int initialSpace = 0; // 初始化空格数量
        printLevelOrder(root, initialSpace);
    
        return 0;
    }
    

    在这个代码中,我们并没有使用putchar函数,因为cout可以直接输出字符和换行符。如果你确实想使用putchar函数来控制输出空格,可以稍微修改一下代码。不过要注意,putchar(NULL) 是不会立即停止程序的,它会输出ASCII码为NULL(即0)的字符,这通常是一个不可见的控制字符。为了避免这种情况,你应该始终确保putchar的参数是有效的字符。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 4月23日

悬赏问题

  • ¥15 python 打包sdk不成功,如何解决?
  • ¥15 adv找不到可向其添加属性的有效项目。
  • ¥15 cesm2.2.0移植问题。./manage_externals/checkout_externals
  • ¥15 ntp对时中的时标问题
  • ¥35 pcb上电后,不一会儿,主控过热烧毁
  • ¥15 ubuntu,windows,文件传输,Linux
  • ¥15 北斗定位,cors,无人机,图传
  • ¥15 Unity热更新框架问题
  • ¥20 如何提交icra的附录.应该在哪里提交
  • ¥20 请教yolov8出现如下bug怎么办