void preorderTraversal(TreeNode* root) { if (!root) return; cout << root->val << " "; preorderTraversal(root->left); preorderTraversal(root->right); }请逐行解释
时间: 2024-03-15 21:46:36 浏览: 7
这是一个二叉树的先序遍历函数,函数接收一个二叉树节点指针作为参数,对该二叉树进行先序遍历,输出每个节点的值。下面是函数的具体实现:
```c++
void preorderTraversal(TreeNode* root) {
if (!root) return; // 如果当前节点为空,直接返回
cout << root->val << " "; // 输出当前节点的值
preorderTraversal(root->left); // 递归遍历左子树
preorderTraversal(root->right); // 递归遍历右子树
}
```
函数执行流程如下:
1. 判断当前节点是否为空,如果为空则直接返回。
2. 输出当前节点的值。
3. 递归遍历当前节点的左子树。
4. 递归遍历当前节点的右子树。
这样,就可以通过先序遍历的方式遍历整个二叉树,并输出每个节点的值。
相关问题
#include <iostream> #include <queue> #include<string> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 递归实现先序遍历 void preorderTraversal(TreeNode* root) { if (root) { cout << root->val << " "; preorderTraversal(root->left); preorderTraversal(root->right); } } // 非递归实现层次遍历 void levelOrderTraversal(TreeNode* root) { if (!root) { return; } queue<TreeNode*> q; q.push(root); while (!q.empty()) { TreeNode* cur = q.front(); q.pop(); cout << cur->val << " "; if (cur->left) { q.push(cur->left); } if (cur->right) { q.push(cur->right); } } } int main() { // 建立二叉树 TreeNode* root = new TreeNode(65); root->left = new TreeNode(66); root->right = new TreeNode(67); root->left->left = new TreeNode(68); root->left->right = new TreeNode(69); root->left->left->left = new TreeNode(72); root->left->right->right = new TreeNode(73); root->right->left = new TreeNode(70); root->right->right = new TreeNode(71); root->right->left->left = new TreeNode(74); // 先序遍历 cout << "Preorder Traversal: "; preorderTraversal(root); cout << endl; // 层次遍历 cout << "Level Order Traversal: "; levelOrderTraversal(root); cout << endl; return 0; }怎么将代码内节点的数字改成字母
要将节点的数字改成字母,可以将 TreeNode 结构体中的 val 成员变量改为 string 类型,并将节点的值赋为相应的字母。例如,将节点的数字 65 改为字母 A,将节点的数字 66 改为字母 B,以此类推,可以将代码修改如下:
```
#include <iostream>
#include <queue>
#include <string>
using namespace std;
struct TreeNode {
string val; // 将节点的值从 int 类型改为 string 类型
TreeNode* left;
TreeNode* right;
TreeNode(string s) : val(s), left(NULL), right(NULL) {} // 将节点的值初始化为字符串类型
};
// 递归实现先序遍历
void preorderTraversal(TreeNode* root) {
if (root) {
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
}
// 非递归实现层次遍历
void levelOrderTraversal(TreeNode* root) {
if (!root) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* cur = q.front();
q.pop();
cout << cur->val << " ";
if (cur->left) {
q.push(cur->left);
}
if (cur->right) {
q.push(cur->right);
}
}
}
int main() {
// 建立二叉树
TreeNode* root = new TreeNode("A"); // 将节点的值从数字改为字母
root->left = new TreeNode("B");
root->right = new TreeNode("C");
root->left->left = new TreeNode("D");
root->left->right = new TreeNode("E");
root->left->left->left = new TreeNode("H");
root->left->right->right = new TreeNode("I");
root->right->left = new TreeNode("F");
root->right->right = new TreeNode("G");
root->right->left->left = new TreeNode("J");
// 先序遍历
cout << "Preorder Traversal: ";
preorderTraversal(root);
cout << endl;
// 层次遍历
cout << "Level Order Traversal: ";
levelOrderTraversal(root);
cout << endl;
return 0;
}
```
这样就可以将节点的数字改成相应的字母了。
#include <iostream> #include <vector> #include <sstream> using namespace std; struct TreeNode { string val; TreeNode* left; TreeNode* right; TreeNode(string x) : val(x), left(nullptr), right(nullptr) {} }; TreeNode* buildTreeHelper(const vector<string>& preorder, int& pos, const string& sep) { if (pos >= preorder.size() || preorder[pos] == sep) { ++pos; return nullptr; } string s = preorder[pos]; ++pos; TreeNode* root = new TreeNode(s); root->left = buildTreeHelper(preorder, pos, sep); root->right = buildTreeHelper(preorder, pos, sep); return root; } TreeNode* buildTree(const vector<string>& preorder, const string& sep) { int pos = 0; return buildTreeHelper(preorder, pos, sep); } void preorder1(TreeNode* root) { if (!root) return; cout << root->val << ","; preorder1(root->left); preorder1(root->right); } void inorder(TreeNode* root) { if (!root) return; inorder(root->left); cout << root->val << ","; inorder(root->right); } void postorder(TreeNode* root) { if (!root) return; postorder(root->left); postorder(root->right); cout << root->val << ","; } int main() { string sep; getline(cin, sep); vector<string> preorder; string line; getline(cin, line); stringstream ss(line); string s; while (getline(ss, s, ' ')) { preorder.push_back(s); } TreeNode* root = buildTree(preorder, sep); cout << "Preorder: "; preorder1(root); cout << endl; cout << "Inorder: "; inorder(root); cout << endl; cout << "Postorder: "; postorder(root); cout << endl; return 0; }如何避免在输出序列最后多输出一个逗号
可以在输出序列中,在每个值后面输出逗号,而在最后一个值后面不输出逗号。可以通过在遍历时判断当前节点是否是最后一个节点来实现。具体来说,在先序遍历、中序遍历和后序遍历函数中,在输出当前节点值之前,需要先判断其是否为最后一个节点,若是,则不输出逗号。可以通过比较当前节点的左右子树是否为空来判断。修改后的代码如下:
```cpp
void preorder1(TreeNode* root) {
if (!root) return;
cout << root->val;
if (root->left || root->right) cout << ",";
preorder1(root->left);
preorder1(root->right);
}
void inorder(TreeNode* root) {
if (!root) return;
inorder(root->left);
cout << root->val;
if (root->left || root->right) cout << ",";
inorder(root->right);
}
void postorder(TreeNode* root) {
if (!root) return;
postorder(root->left);
postorder(root->right);
cout << root->val;
if (root->left || root->right) cout << ",";
}
```