代码随想录2.2

文章目录

    • 二叉树的递归遍历(深度优先)
      • 144.二叉树的前序遍历【中左右】
      • 145.二叉树的后序遍历【左右中】
      • 94.二叉树的中序遍历【左中右】
    • 二叉树的迭代遍历(深度优先)
      • 前序迭代遍历【中左右】
      • 中序迭代遍历
      • 后序迭代遍历
    • 二叉树的统一迭代(深度优先)

二叉树的递归遍历(深度优先)

不同的遍历其实就是调换下列几句代码的顺序:

    traversal(cur->left, vec); //左
    traversal(cur->right, vec); //右
    vec.push_back(cur->val); //中

144.二叉树的前序遍历【中左右】

  1. 二叉树主要用递归
  2. 写递归的步骤:①确定递归函数的参数和返回值;②确定递归终止条件;③确定单层递归的逻辑
    例如,二叉树的前序遍历【中左右】打印:①参数是二叉树(类型是vector来放置节点),返回值不需要(void);②终止条件:当前遍历的节点是空;③先取中节点的数值,再取左节点,再取右节点
class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec) {
        if (cur == NULL) return;
        vec.push_back(cur->val);    // 中:push_back函数将一个新的元素加到vector的最后面
        traversal(cur->left, vec);  // 左
        traversal(cur->right, vec); // 右
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> result;
        traversal(root, result);
        return result;
    }
};

145.二叉树的后序遍历【左右中】

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur, vector<int>& vec){//注意要给vec加地址&
        if(cur == nullptr) return;
        traversal(cur->left, vec);
        traversal(cur->right, vec);
        vec.push_back(cur->val);
    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        traversal(root, res);
        return res;
    }
};

94.二叉树的中序遍历【左中右】

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    void traversal(TreeNode* cur, vector<int> &vec){
        if(cur==nullptr) return;
        traversal(cur->left,vec); //注意写上vec参数
        vec.push_back(cur->val); //注意->val
        traversal(cur->right,vec);
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        traversal(root, res);
        return res;
    }
};

二叉树的迭代遍历(深度优先)

用栈也可以是实现二叉树的前后中序遍历

前序迭代遍历【中左右】

入栈顺序:先放根节点,再放右孩子,再放左孩子。这样出栈才是【中左右】的顺序

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> res;
        if(root==nullptr) return res;
        st.push(root);//因为栈定义的是*存放指针,所以不用->val
        while(!st.empty()){
            TreeNode* node = st.top();//中
            st.pop();
            res.push_back(node->val);
            if(node->right) st.push(node->right);
            if(node->left) st.push(node->left);
        }
        return res;
    }
};

中序迭代遍历

与前序后序都不同。因为前序遍历中访问节点(遍历节点)和处理节点(将元素放进result数组中)可以同步处理,但是中序就无法做到同步!

class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> result;
        stack<TreeNode*> st;
        TreeNode* cur = root;
        while (cur != NULL || !st.empty()) {
            if (cur != NULL) { // 指针来访问节点,访问到最底层
                st.push(cur); // 将访问的节点放进栈
                cur = cur->left;                // 左
            } else {
                cur = st.top(); // 从栈里弹出的数据,就是要处理的数据(放进result数组里的数据)
                st.pop();
                result.push_back(cur->val);     // 中
                cur = cur->right;               // 右
            }
        }
        return result;
    }
};

后序迭代遍历

前序遍历的代码稍作修改

class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        stack<TreeNode*> st;
        vector<int> result;
        if (root == NULL) return result;
        st.push(root);
        while (!st.empty()) {
            TreeNode* node = st.top();
            st.pop();
            result.push_back(node->val);
            if (node->left) st.push(node->left); // 相对于前序遍历,这更改一下入栈顺序 (空节点不入栈)
            if (node->right) st.push(node->right); // 空节点不入栈
        }
        reverse(result.begin(), result.end()); // 将结果反转之后就是左右中的顺序了
        return result;
    }
};

二叉树的统一迭代(深度优先)

将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记
*选择性理解:原讲解链接

你可能感兴趣的:(代码随想录跟练记录,算法,leetcode,java,数据结构,c++)