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 c#调用yolo3 dll文件获取的数据对不上
  • ¥20 WPF 如何实现多语言,label 和cs(live Charts)中是否都能翻译
  • ¥15 STM32F103上电短路问题
  • ¥15 关于#单片机#的问题:以ATMEGA128或相近型号单片机为控制器设计直流电机调速的闭环控制系统(相关搜索:设计报告|软件设计|流程图)
  • ¥15 打开软件提示错误:failed to get wglChoosePixelFormatARB
  • ¥15 (标签-python|关键词-char)
  • ¥15 python+selenium,在新增时弹出了一个输入框
  • ¥15 苹果验机结果的api接口哪里有??单次调用1毛钱及以下。
  • ¥20 学生成绩管理系统设计
  • ¥15 来一个cc穿盾脚本开发者