
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode() : val(0), left(nullptr), right(nullptr) {}
* TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
* TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
* };
*/
class Solution {
public:
// // 初始化
// struck TreeNode{
// int val;
// TreeNode *left;
// TreeNode *right;
// TreeNode(int x): val(x),left(nullptr),right(nullprt){}
// TreeNode(int x,TreeNode *left,TreeNode *right):val(x),left(left),right(right){}
// }
// // 创建
// TreeNode* CreateTree(){
// TreeNode* root =new TreeNode(1);
// root->left = new TreeNode(11);
// root->right = new TreeNode(12);
// root->left->left = new TreeNode(21);
// root->left->right = new TreeNode(21);
// }
/*
A
/ \
B C
/ \ \
D E F
前序遍历: 根 → 左 → 右
前序遍历结果:A → B → D → E → C → F
应用场景:
复制二叉树结构
计算前缀表达式(波兰表示法)
序列化二叉树
中历顺序:左子树 → 根节点 → 右子树
中序遍历结果:D → B → E → A → C → F
应用场景:
二叉搜索树(BST)的有序遍历
中缀表达式求值
按顺序打印树的内容
遍历顺序:左子树 → 右子树 → 根节点
后序遍历结果:D → E → B → F → C → A
应用场景:
删除二叉树(先删除子节点再删除父节点)
计算后缀表达式(逆波兰表示法)
计算目录大小(先计算子目录大小)
*/
// 方法一:递归
void inorder(TreeNode* node_,vector<int> &result){
if(node_ == nullptr) return ;
inorder(node_->left,result);
cout<<"节点 " << node_->val <<endl;
result.push_back(node_->val);
inorder(node_->right,result);
}
//方法一:递归 递归的时候隐式地维护了一个栈
vector<int> inorderTraversal_1(TreeNode* root) {
vector<int> result;
inorder(root,result);
return result;
}
vector<int> inorderTraversal(TreeNode* root) {
stack<TreeNode*> s;
vector<int> result;
TreeNode* curr = root;
while(curr !=nullptr || !s.empty()){
while(curr !=nullptr) {
s.push(curr);
curr=curr->left;
}
curr = s.top();
s.pop();
result.push_back(curr->val);
curr=curr->right;
}
return result;
}
};