6.2二叉树的迭代遍历

简介: 6.2二叉树的迭代遍历

在6.1中我们通过使用递归实现了二叉树的前、中、后序的遍历,本文将介绍使用迭代法实现二叉树前中后遍历,写出统一风格的代码。

根本思想:将要访问的节点放入栈中,将要处理的节点放入栈中但是要做标记,即将要处理的节点放入栈中以后,紧接着放入一个空指针作为标记。这种方法也可以叫 标记法

一、使用迭代法实现中序遍历

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中
                if (node->right) st.push(node->right);  // 添加右节点(空节点不入栈)
                st.push(node);                          // 添加中节点
                st.push(NULL); // 中节点访问过,但是还没有处理,加入空节点做为标记。
                if (node->left) st.push(node->left);    // 添加左节点(空节点不入栈)
            } else { // 只有遇到空节点的时候,才将下一个节点放进结果集
                st.pop();           // 将空节点弹出
                node = st.top();    // 重新取出栈中元素
                st.pop();
                result.push_back(node->val); // 加入到结果集
            }
        }
        return result;
    }
};

二、使用迭代法实现前序遍历

理论:中-左-右

代码:右-左-中

在中序遍历的基础上改变三行代码即可。

class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop(); // 将该节点弹出,避免重复操作,下面再将右中左节点添加到栈中
                if (node->right) st.push(node->right);  // 添加右节点(空节点不入栈)
                if (node->left) st.push(node->left);    // 添加左节点(空节点不入栈)
                st.push(node);                          // 添加中节点
                st.push(NULL); // 中节点访问过,但是还没有处理,加入空节点做为标记。
            } else { // 只有遇到空节点的时候,才将下一个节点放进结果集
                st.pop();           // 将空节点弹出
                node = st.top();    // 重新取出栈中元素
                st.pop();
                result.push_back(node->val); // 加入到结果集
            }
        }
        return result;
    }
};

三、使用迭代法实现后序遍历

在中序遍历的基础上改变三行代码即可。

理论:左-右-中

代码:中-右-左

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        if (root != NULL) st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            if (node != NULL) {
                st.pop();
                st.push(node);                          // 中
                st.push(NULL);
                if (node->right) st.push(node->right);  // 右
                if (node->left) st.push(node->left);    // 左
            } else {
                st.pop();
                node = st.top();
                st.pop();
                result.push_back(node->val);
            }
        }
        return result;
    }
};


目录
相关文章
|
5月前
leetcode94二叉树的中序遍历(迭代做法)
leetcode94二叉树的中序遍历(迭代做法)
44 0
|
5月前
二叉树的统一迭代遍历法
二叉树的统一迭代遍历法
34 0
|
18天前
02_二叉树的迭代遍历
02_二叉树的迭代遍历
|
4月前
|
存储 SQL 算法
LeetCode 题目 94:五种算法递归|迭代|莫里斯|线索二叉树|栈的迭代二叉树 实现中序遍历
LeetCode 题目 94:五种算法递归|迭代|莫里斯|线索二叉树|栈的迭代二叉树 实现中序遍历
|
11月前
|
算法 C++
87 C++ - 常用遍历算法
87 C++ - 常用遍历算法
42 0
|
算法
用递归的思想实现二叉树前、中、后序迭代遍历
用递归的思想实现二叉树前、中、后序迭代遍历
64 1
二叉树的遍历(递归And迭代)
二叉树的遍历(递归And迭代)
45 0
|
5月前
|
算法
每日一题——排序链表(递归 + 迭代)
每日一题——排序链表(递归 + 迭代)
|
存储 编译器
二叉树的递归遍历与迭代遍历(图示)
本文将讲述二叉树递归与迭代的相关知识。
123 0
二叉树的三种遍历方式
二叉树的三种遍历方式
219 0
二叉树的三种遍历方式