非递归版本:
#include<iostream>
#include<stack>
using namespace std;
struct TreeNode {
int _val;
TreeNode* left, * right;
TreeNode(const int& val) :_val(val), left(nullptr), right(nullptr) {}
~TreeNode() {
delete left, right;
}
};
void inorderTraversal(TreeNode* root) {
TreeNode* cur = root;
stack<TreeNode*> st;
while (cur || !st.empty()) {
while (cur) {
st.push(cur);
cur = cur->left;
}
cur = st.top();
st.pop();
cout << cur->_val << " ";
cur = cur->right;
}
}
int main() {
// 用例1:简单的二叉搜索树
TreeNode* root1 = new TreeNode(5);
root1->left = new TreeNode(3);
root1->right = new TreeNode(7);
root1->left->left = new TreeNode(2);
root1->left->right = new TreeNode(4);
root1->right->left = new TreeNode(6);
root1->right->right = new TreeNode(8);
cout << "Inorder traversal of BST: ";
inorderTraversal(root1);
cout << endl;
// 用例2:只有一个节点的树
TreeNode* root2 = new TreeNode(10);
cout << "Inorder traversal of single node tree: ";
inorderTraversal(root2);
cout << endl;
// 用例3:空树
TreeNode* root3 = nullptr;
cout << "Inorder traversal of empty tree: ";
inorderTraversal(root3);
cout << endl;
// 用例4:不平衡的树
TreeNode* root4 = new TreeNode(1);
root4->left = new TreeNode(2);
root4->left->left = new TreeNode(3);
root4->left->left->left = new TreeNode(4);
cout << "Inorder traversal of unbalanced tree: ";
inorderTraversal(root4);
cout << endl;
// 用例5:退化成链表的树
TreeNode* root5 = new TreeNode(1);
TreeNode* cur = root5;
for (int i = 2; i <= 5; ++i) {
cur->right = new TreeNode(i);
cur = cur->right;
}
cout << "Inorder traversal of linked list tree: ";
inorderTraversal(root5);
cout << endl;
// 释放所有节点的内存
delete root1;
delete root2;
delete root3; // 虽然是空指针,但delete空指针是安全的
delete root4;
delete root5;
return 0;
}
值得注意的点:
1.stack中存放的是树的节点的地址也就是TreeNode*类型。
2. TreeNode的析构函数千万不要忘记,因为我们是在堆上申请的内存。
3.delete空指针什么都不做。
下面我们实现递归版本,这个要容易地多。
#include<iostream>
#include<stack>
using namespace std;
struct TreeNode {
int _val;
TreeNode* left, * right;
TreeNode(const int& val) :_val(val), left(nullptr), right(nullptr) {}
~TreeNode() {
delete left, right;
}
};
void inorderTraversal(TreeNode* root) {
if (root == nullptr)return;
inorderTraversal(root->left);
cout << root->_val << " ";
inorderTraversal(root->right);
}
int main() {
// 用例1:简单的二叉搜索树
TreeNode* root1 = new TreeNode(5);
root1->left = new TreeNode(3);
root1->right = new TreeNode(7);
root1->left->left = new TreeNode(2);
root1->left->right = new TreeNode(4);
root1->right->left = new TreeNode(6);
root1->right->right = new TreeNode(8);
cout << "Inorder traversal of BST: ";
inorderTraversal(root1);
cout << endl;
// 用例2:只有一个节点的树
TreeNode* root2 = new TreeNode(10);
cout << "Inorder traversal of single node tree: ";
inorderTraversal(root2);
cout << endl;
// 用例3:空树
TreeNode* root3 = nullptr;
cout << "Inorder traversal of empty tree: ";
inorderTraversal(root3);
cout << endl;
// 用例4:不平衡的树
TreeNode* root4 = new TreeNode(1);
root4->left = new TreeNode(2);
root4->left->left = new TreeNode(3);
root4->left->left->left = new TreeNode(4);
cout << "Inorder traversal of unbalanced tree: ";
inorderTraversal(root4);
cout << endl;
// 用例5:退化成链表的树
TreeNode* root5 = new TreeNode(1);
TreeNode* cur = root5;
for (int i = 2; i <= 5; ++i) {
cur->right = new TreeNode(i);
cur = cur->right;
}
cout << "Inorder traversal of linked list tree: ";
inorderTraversal(root5);
cout << endl;
// 释放所有节点的内存
delete root1;
delete root2;
delete root3; // 虽然是空指针,但delete空指针是安全的
delete root4;
delete root5;
return 0;
}