[TOC]

一、深度优先遍历

144. 二叉树的前序遍历(简单难度)

方法一:递归遍历法
class Solution {
public:
    vector<int> res;
    vector<int> preorderTraversal(TreeNode* root) {
        if(root==nullptr) return res;
        res.push_back(root->val);//前序位置插入
        preorderTraversal(root->left);
        preorderTraversal(root->right);
        return res;
    }
};
方法二:迭代遍历法
class Solution {
public:
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==nullptr) return res;
        //根节点先入栈
        stack<TreeNode*> stk;
        stk.push(root);
        while(!stk.empty()){
            // 出栈
            TreeNode* cur=stk.top();
            stk.pop();
            //处理节点
            res.push_back(cur->val);
            //右入栈
            if(cur->right) stk.push(cur->right);
            //左入栈
            if(cur->left) stk.push(cur->left);
        }
        return res;
    }
};

方法三:分治思想

class Solution {
public:
    // 定义:输入二叉树,返回其前序遍历数组
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==nullptr) return res;
        // 获取左、右子树的前序遍历数组
        vector<int> leftRes=preorderTraversal(root->left);
        vector<int> rightRes=preorderTraversal(root->right);
        // 一棵二叉树的前序遍历结果 = 根节点 + 左子树的前序遍历结果 + 右子树的前序遍历结果
        res.push_back(root->val);
        res.insert(res.end(),leftRes.begin(),leftRes.end());
        res.insert(res.end(),rightRes.begin(),rightRes.end());
        return res;
    }
};

94. 二叉树的中序遍历(简单难度)

方法一:递归法
class Solution {
private:
    vector<int> res;
public:
    vector<int> inorderTraversal(TreeNode* root) {
        if(root==nullptr) return res;
        inorderTraversal(root->left);
        res.push_back(root->val);
        inorderTraversal(root->right);
        return res;
    }
};
方法二:迭代法
class Solution {
public:
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==nullptr) return res;
        //根节点先入栈
        stack<TreeNode*> stk;
        TreeNode* cur=root;
        while(cur||!stk.empty()){
            // 存在
            if(cur){
                stk.push(cur);//入栈
                cur=cur->left;//换左边
            }
            // 不存
            else{
                cur=stk.top();//出栈
                stk.pop();
                // 处理节点
                res.push_back(cur->val);
                cur=cur->right;//换右边
            }
        }
        return res;
    }
};

145. 二叉树的后序遍历

方法一:递归法
class Solution {
private:
    vector<int> res;
public:
    vector<int> postorderTraversal(TreeNode* root) {
        if(root==nullptr) return res;
        postorderTraversal(root->left);
        postorderTraversal(root->right);
        res.push_back(root->val);
        return res;
    }
};
方法二:迭代法
class Solution {
public:
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> res;
        if(root==nullptr) return res;
        //根节点先入栈
        stack<TreeNode*> stk;
        stk.push(root);
        while(!stk.empty()){
            // 出栈
            TreeNode* cur=stk.top();
            stk.pop();
            //处理节点
            res.push_back(cur->val);
            //左入栈
            if(cur->left) stk.push(cur->left);
            //右入栈
            if(cur->right) stk.push(cur->right);
        }
        reverse(res.begin(), res.end());// 反向
        return res;
    }
};

589. N 叉树的前序遍历(简单难度)

class Solution {
private:
    vector<int> res;
public:
    vector<int> preorder(Node* root) {
        if(root==nullptr) return res;
        res.push_back(root->val);
        for(Node* node:root->children)
            preorder(node);
        return res;
    }
};

590. N 叉树的后序遍历(简单难度)

class Solution {
private:
    vector<int> res;
public:
    vector<int> postorder(Node* root) {
        if(root==nullptr) return res;
        for(Node* node:root->children)
            postorder(node);
        res.push_back(root->val);
        return res;
    }
};

114. 二叉树展开为链表(中等难度)

class Solution {
public:
    void flatten(TreeNode* root) {
        TreeNode* pre=nullptr;
        if(root==nullptr) return ;
        //根节点先入栈
        stack<TreeNode*> stk;
        stk.push(root);
        while(!stk.empty()){
            // 出栈
            TreeNode* cur=stk.top();
            stk.pop();
            //处理节点
            if(pre) pre->right=cur;
            pre=cur;
            //右入栈
            if(cur->right) stk.push(cur->right);
            //左入栈
            if(cur->left) stk.push(cur->left);
        }
        pre=root;
        while(pre){
            pre->left=nullptr;
            pre=pre->right;
        }
    }
};

二、广度优先遍历

面试题32 - I. 从上到下打印二叉树(中等难度)

class Solution {
public:
    vector<int> levelOrder(TreeNode* root) {
        vector<int> res;
        if(root==NULL) return res;
        // 先入队 
        queue<TreeNode*> que;
        que.push(root);
        while(!que.empty()){
            // 出队
            TreeNode* cur=que.front();
            que.pop();
            // 处理节点
            res.push_back(cur->val);
            // 入队
            if(cur->left) que.push(cur->left);
            if(cur->right) que.push(cur->right);
        }
        return res;
    }
};

102. 二叉树的层序遍历(中等难度)

剑指 Offer 32 - II. 从上到下打印二叉树 II(中等难度)

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        if(root==NULL) return result;
        //先入队
        queue<TreeNode*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            vector<int> level_result;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                TreeNode* cur=queue.front();
                queue.pop();
                //处理节点
                level_result.push_back(cur->val);
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
            //添加层数组
            result.push_back(level_result);
        }
        return result;
    }
};

107. 二叉树的层序遍历 II(中等难度)

class Solution {
public:
    vector<vector<int>> levelOrderBottom(TreeNode* root) {
        vector<vector<int>> result;
        if(root==NULL) return result;
        //先入队
        queue<TreeNode*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            vector<int> level_result;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                TreeNode* cur=queue.front();
                queue.pop();
                //处理节点
                level_result.push_back(cur->val);
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
            //添加层数组
            result.push_back(level_result);
        }
        reverse(result.begin(),result.end());
        return result;
    }
};

剑指 Offer 32 - III. 从上到下打印二叉树 III(中等难度)

class Solution {
public:
    vector<vector<int>> levelOrder(TreeNode* root) {
        vector<vector<int>> result;
        if(root==NULL) return result;
        //先入队
        queue<TreeNode*> queue;
        queue.push(root);
        bool isReverse=false;
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            vector<int> level_result;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                TreeNode* cur=queue.front();
                queue.pop();
                //处理节点
                level_result.push_back(cur->val);
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
            //添加层数组
            if(isReverse) reverse(level_result.begin(),level_result.end());
            isReverse = !isReverse;
            result.push_back(level_result);
        }
        return result;
    }
};

429. N 叉树的层序遍历(中等难度)

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        vector<vector<int>> result;
        if(root==NULL) return result;
        //先入队
        queue<Node*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            vector<int> level_result;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                Node* cur=queue.front();
                queue.pop();
                //处理节点
                level_result.push_back(cur->val);
                //先左后右入队
                for(Node* node:cur->children){
                    if(node)   queue.push(node);
                }
            }
            //添加层数组
            result.push_back(level_result);
        }
        return result;
    }
};

103. 二叉树的锯齿形层序遍历(中等难度)

class Solution {
public:
    vector<vector<int>> zigzagLevelOrder(TreeNode* root) {
        vector<vector<int>> res;
        if(root==nullptr) return res;
        bool flag=false;
        queue<TreeNode*>  que;
        que.push(root);
        while(!que.empty()){
            vector<int> level;
            int size=que.size();
            for(int i=0;i<size;++i){
                // 出栈
                TreeNode* cur=que.front();
                que.pop();
                // 处理
                level.push_back(cur->val);
                if(cur->left) que.push(cur->left);
                if(cur->right) que.push(cur->right);
            }
            if(flag)reverse(level.begin(), level.end());
            flag=!flag;
            res.push_back(level);
        }
        return res;
    }
};

199. 二叉树的右视图(中等难度)

剑指 Offer II 046. 二叉树的右侧视图(中等难度)

class Solution {
public:
    vector<int> rightSideView(TreeNode* root) {
        vector<int> result;
        if(root==NULL) return result;
        //先入队
        queue<TreeNode*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            vector<int> level_result;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                TreeNode* cur=queue.front();
                queue.pop();
                //处理节点
                level_result.push_back(cur->val);
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
            //添加层数组
            result.push_back(level_result.back());
        }
        return result;
    }
};

515. 在每个树行中找最大值(中等难度)

剑指 Offer II 044. 二叉树每层的最大值(中等难度)

class Solution {
public:
    vector<int> largestValues(TreeNode* root) {
        vector<int> result;
        if(root==NULL) return result;
        //先入队
        queue<TreeNode*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            int level_max=INT_MIN;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                TreeNode* cur=queue.front();
                queue.pop();
                //处理节点
                level_max=max(level_max,cur->val);
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
            //添加层数组
            result.push_back(level_max);
        }
        return result;
    }
};

513. 找树左下角的值(中等难度)

剑指 Offer II 045. 二叉树最底层最左边的值(中等难度)

class Solution {
public:
    int findBottomLeftValue(TreeNode* root) {
        vector<vector<int>> result;
        if(root==NULL) return -1;
        //先入队
        queue<TreeNode*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            vector<int> level_result;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                TreeNode* cur=queue.front();
                queue.pop();
                //处理节点
                level_result.push_back(cur->val);
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
            //添加层数组
            result.push_back(level_result);
        }
        return result.back()[0];
    }
};

637. 二叉树的层平均值(简单难度)

class Solution {
public:
    vector<double> averageOfLevels(TreeNode* root) {
        vector<double> result;
        if(root==NULL) return result;
        //先入队
        queue<TreeNode*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            double level_sum=0.0;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                TreeNode* cur=queue.front();
                queue.pop();
                //处理节点
                level_sum+=cur->val;
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
            //添加层数组
            result.push_back(level_sum/size);
        }
        return result;
    }
};

116. 填充每个节点的下一个右侧节点指针(中等难度)

117. 填充每个节点的下一个右侧节点指针 II(中等难度)

class Solution {
public:
    Node* connect(Node* root) {
        if(root==NULL) return root;
        //先入队
        queue<Node*> queue;
        queue.push(root);
        //队不为空就遍历
        while(!queue.empty()){
            //更新当前队列大小
            int size = queue.size();
            //层数组
            //vector<int> level_result;
            Node* pre=NULL;
            //遍历当前队列(正好存储当前层元素)
            for(int i=0;i<size;i++){
                //出队
                Node* cur=queue.front();
                queue.pop();
                //处理节点
                if(pre) pre->next=cur;
                pre=cur;
                //先左后右入队
                if (cur->left)queue.push(cur->left);
                if (cur->right)queue.push(cur->right);
            }
        }
        return root;
    }
};