递归方式比较直观就不说了。
树节点定义:
struct TreeNode{
int val;
TreeNode* left, *right;
TreeNode(int _val):val(_val),left(nullptr),right(nullptr){}
};
前序遍历:
list<int> preOrder(TreeNode* root){
list<int> ans;
if(root== nullptr)
return ans;
stack<TreeNode*> st;
TreeNode *p=root;
while(!st.empty()||p){ //针对根结点
if(p!=nullptr){
st.push(p);
ans.push_back(p->val); //前序遍历:根、左、右
p=p->left;
}else{
p=st.top()->right;
st.pop();
}
}
return ans;
}
中序遍历:
list<int> inOrder(TreeNode* root){
list<int> ans;
if(root== nullptr)
return ans;
stack<TreeNode*> st;
TreeNode *p=root;
while(!st.empty()||p){
if(p){
st.push(p);
p=p->left;
}else{
ans.push_back(st.top()->val); //一路向左,访问最左值
p=st.top()->right;
st.pop();
}
}
return ans;
}
后序遍历:
list<int> postOrder(TreeNode* root){
list<int> ans;
if(root== nullptr)
return ans;
stack<TreeNode*> st;
TreeNode *p=root;
while(!st.empty()||p){
if(p){
st.push(p);
ans.push_front(p->val); //list前插,所以按照后序遍历的反面遍历:根、右、左
p=p->right;
}else{
p=st.top()->left;
st.pop();
}
}
return ans;
}