迭代法实现的前中后序遍历,除了前序和后序相互关联,中序则是另一种风格。我们需要针对三种遍历方式实现统一风格的代码。如何统一风格:解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。将访问的节点放入栈中,把要处理的节点放入栈中但是做标记(紧接着放入一个空指针)。
统一迭代-中序遍历
class Solution{
public:
vector<int> inorderTraversal(TreeNode* root){
vector<int> result;
satck(TreeNode*) st;
//判断是否为空树
if(root == NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
if(cur != NULL){
st.pop();//弹出该节点避免重复压入栈,下面将右中左压入栈中
if(cur->right) st.push(cur->right);
//中节点访问过但是未处理,添加空节点做标记
st.push(cur);
st.push(NULL);
if(cur->left) st.push(cur->left);
}else{//遇到空节点则将栈内下一个节点放入结果集
st.pop(); //删除栈内空节点
cur = st.top();
st.pop();//删除栈内处理的节点
result.push_back(cur->val);
}
}
return result;
}
};
统一迭代-前序遍历
class Solution{
public:
vector<int> inorderTraversal(TreeNode* root){
vector<int> result;
satck(TreeNode*) st;
//判断是否为空树
if(root == NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
if(cur != NULL){
st.pop();//弹出该节点避免重复压入栈,下面将右中左压入栈中
if(cur->right) st.push(cur->right);
if(cur->left) st.push(cur->left);
//中节点访问过但是未处理,添加空节点做标记
st.push(cur);
st.push(NULL);
}else{//遇到空节点则将栈内下一个节点放入结果集
st.pop(); //删除栈内空节点
cur = st.top();
st.pop();//删除栈内处理的节点
result.push_back(cur->val);
}
}
return result;
}
};
统一迭代-后序遍历
class Solution{
public:
vector<int> inorderTraversal(TreeNode* root){
vector<int> result;
satck(TreeNode*) st;
//判断是否为空树
if(root == NULL) return result;
st.push(root);
while(!st.empty()){
TreeNode* cur = st.top();
if(cur != NULL){
st.pop();//弹出该节点避免重复压入栈,下面将右中左压入栈中
//中节点访问过但是未处理,添加空节点做标记
st.push(cur);
st.push(NULL);
if(cur->right) st.push(cur->right);
if(cur->left) st.push(cur->left);
}else{//遇到空节点则将栈内下一个节点放入结果集
st.pop(); //删除栈内空节点
cur = st.top();
st.pop();//删除栈内处理的节点
result.push_back(cur->val);
}
}
return result;
}
};
访问是遍历节点,处理则是将元素放进结果集中,统一风格的迭代遍历实际上是利用NULL去标记处理的元素,然后逐次输出。
标签:result,cur,st,二叉树,push,迭代法,NULL,节点,统一 From: https://www.cnblogs.com/perngfey-note/p/18118786