Fork me on GitHub

二叉树-统一迭代法

迭代法实现的前中后序遍历,除了前序和后序相互关联,中序则是另一种风格。我们需要针对三种遍历方式实现统一风格的代码。如何统一风格:解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。将访问的节点放入栈中,把要处理的节点放入栈中但是做标记(紧接着放入一个空指针)。

统一迭代-中序遍历

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去标记处理的元素,然后逐次输出。

posted @ 2024-04-07 11:57  bupaanything  阅读(84)  评论(0)    收藏  举报
1