参考链接:https://www.jianshu.com/p/12848eef3452
栈实现树的前序遍历
void preTraversal(TreeNode* root){
if(root==NULL)
return ;
stack<TreeNode*> s;
TreeNode *current;
s.push(root);
while(s.empty()==false){
current = s.top();
s.pop();
cout<<current->val<<endl; // 或者其他对节点的访问操作
if(current->right!=NULL)
s.push(current->right);
if(current->left!=NULL)
s.push(current->left);
// 先压右节点再左节点是利用栈的后进先出特性,这样达到先访问左节点再访问右节点的功能
}
}
栈实现树的中序遍历
void inorderTraversal(TreeNode* root){
if(root == NULL)
return ;
stack<TreeNode*> s;
TreeNode *current;
s.push(root);
while(s.empty() == false){
while(s.top()->left!=NULL)
s.push(s.top()->left); // 一直遍历到最左节点
while(s.empty() == false){
current = s.top(); // 第一个为最左边的节点
cout<<current->val<<endl; // 输出操作也可以是其他对节点的访问操作
if(current->right!=NULL){
s.push(current->right);
break; // 需要跳出循环,右边的仍需要一直遍历到最左边
}
}
}
}
栈实现树的后序遍历
void postTraversal(TreeNode* root){
if(root == NULL)
return ;
stack<TreeNode*> s;
TreeNode *lastNode = NULL; // 保存上一个节点信息
s.push(root);
while(s.empty() == false){
while(s.top()->left!=NULL) // 同中序遍历,一直遍历到最左边节点
s.push(s.top()->left);
while(s.empty() == false){
if(s.top()->right == lastNode||s.top()->right == NULL){ // 如果右节点已经访问过或者无右节点才能够访问根节点
cout<<s.top()->val<<endl; // 对该节点进行访问
lastNode = s.top();
s.pop();
}
else if(s.top()->right!=NULL){
s.push(s.top()->right);
break;
}
}
}
}