C++模板实现二叉树中序遍历 声明stack报缺';'语法错误求助
编译错误原因
你碰到的expected ';'报错不是模板语法本身的特殊规则导致的,是代码里几处写法错误共同造成的,具体问题点:
- 标准库类型缺少命名空间限定:
stack、cout都属于std命名空间,你既没有加std::前缀,也没有提前做using声明,编译器识别不出stack这个类型名,才会抛出“期望分号”的语法错误。你之前用int替换T能跑,大概率是测试非模板版本时误加了命名空间相关声明,和模板参数本身无关。 - Node.h头文件保护缺失:你只写了
#define NODE_H_JAMES,没有写#ifndef NODE_H_JAMES的条件判断,头文件一旦被重复包含就会触发类重定义错误。 - 类成员名拼写不匹配:
Node类里存储节点值的成员叫value,你遍历输出时写的是curr->data,就算前面的语法过了这里也会报成员不存在的错误。 - 节点创建函数存在严重类型错误:
new Node写法错误,Node是模板类,实例化必须指定模板参数,而且你写的构造函数需要传入初始值,正确写法是new Node<T>(data)nodetoreturn本身就是Node<T>*类型的堆指针,你返回时写&nodetoreturn取的是栈上局部指针变量的地址,会返回野指针触发运行时崩溃,直接返回nodetoreturn即可。
- 不规范写法:代码里用了C风格的
NULL空指针宏,C++11及以后版本建议用nullptr,避免隐式类型转换带来的问题。
修复后代码
Node.h 头文件
#ifndef NODE_H_JAMES #define NODE_H_JAMES template <typename T> class Node { public: T value; Node* left; Node* right; Node(T val) { this->value = val; left = right = nullptr; } }; #endif
主逻辑cpp文件
#include "Node.h" #include <stack> #include <iostream> template <typename T> void inOrderTraversal(Node<T>* root) { std::stack<Node<T>*> s; Node<T>* curr = root; while (curr != nullptr || !s.empty()) { while (curr != nullptr) { s.push(curr); curr = curr->left; } curr = s.top(); s.pop(); std::cout << curr->value << " "; curr = curr->right; } } template <typename T> Node<T>* newNodeOnHeap(T data) { Node<T>* nodetoreturn = new Node<T>(data); nodetoreturn->left = nullptr; nodetoreturn->right = nullptr; return nodetoreturn; } template <typename T> void deleteNodeOnHeap(T* node){ delete node; } int main() { Node<int>* root = newNodeOnHeap(10); root->left = newNodeOnHeap(5); root->right = newNodeOnHeap(20); root->left->left = newNodeOnHeap(3); root->left->right = newNodeOnHeap(7); root->right->right = newNodeOnHeap(30); inOrderTraversal(root); // 实际使用时需要遍历整棵树释放所有节点内存,此处省略完整释放逻辑 return 0; }
修复后代码可以正常编译运行,中序遍历输出结果为3 5 7 10 20 30。
内容的提问来源于stack exchange,提问作者James
相关产品推荐
相关产品推荐

