定义函数递归打印二叉树为什么要参数不等于NULL
putchar的参数是NULL的话会直接停止打印吗
引自免费微信小程序:皆我百晓生
在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的参数是有效的字符。