leetcode刷题 二叉树的迭代遍历以及层序遍历

二叉树的迭代遍历

前序遍历

/**
 * 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) {
        TreeNode * p = root;
        stack<TreeNode *> st;
        vector<int> result;
        while(p || !st.empty()){
            if(p == nullptr){
                p = st.top();
                st.pop();
                p = p->right;
            }
            else{
                result.push_back(p->val);
                st.push(p);
                p = p->left;
            }
        }
        return result;
    }
};

中序遍历

/**
 * 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> inorderTraversal(TreeNode* root) {
        stack<TreeNode *> st;
        vector<int> result;
        TreeNode * p = root;
        while(p || !st.empty()){
            if(p == nullptr){
                p = st.top();
                st.pop();
                result.push_back(p->val);
                p = p->right;
            }
            else{
                st.push(p);
                p = p->left;
            }
        }
        return result;
    }
};

后序遍历

/**
 * 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> postorderTraversal(TreeNode* root) {
        stack<TreeNode *> st;
        vector<int> result;
        TreeNode * p = root;
        TreeNode * r = nullptr;
        while(p || !st.empty()){
            if(p == nullptr){
                p = st.top();
                if(p->right && r != p->right){
                    p = p->right;
                }
                else{
                    r = p;
                    result.push_back(p->val);
                    st.pop();
                    p = nullptr;
                }
            }
            else{
                st.push(p);
                p = p->left;
            }
        }
        return result;
    }
};

二叉树的层序遍历

102.二叉树的层序遍历

示例1:

输入:root = [3,9,20,null,null,15,7]
输出:[[3],[9,20],[15,7]]

示例 2:

输入:root = [1]
输出:[[1]]

示例 3:

输入:root = []
输出:[]

/**
 * 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<vector<int>> levelOrder(TreeNode* root) {
        queue<TreeNode *> que;
        TreeNode * p = root;
        vector<vector<int>> result;
        if(p != nullptr)
            que.push(p);
        int size;
        while(!que.empty()){
            size = que.size();//得出每一层的结点数量
            vector<int> vec;
            for(int i = 0; i < size; ++i){//将每一层的结点放在同一个矢量中
                p = que.front();
                que.pop();
                vec.push_back(p->val);
                if(p->left != nullptr)
                    que.push(p->left);
                if(p->right != nullptr)
                    que.push(p->right);
            }
            result.push_back(vec);
        }
        return result;
    }
};

107.二叉树的层次遍历 II

给定一个二叉树,返回其节点值自底向上的层次遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)

自下而上的层序遍历将自上而下的层序遍历得到的结果逆置即可。即reverse(result.begin(), result.end());

199.二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

将每一层的最后一个结点放入结果即可

/**
 * 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> rightSideView(TreeNode* root) {
        vector<int> result;
        TreeNode * p = root;
        queue<TreeNode *> que;
        if(p != nullptr)
            que.push(p);
        int size;
        while(!que.empty()){
            size = que.size();
            for(int i = 0; i < size; ++i){
                p = que.front();
                que.pop();
                if(p->left != nullptr)
                    que.push(p->left);
                if(p->right != nullptr)
                    que.push(p->right);
            }
            result.push_back(p->val);
        }
        return result;
    }
};

637.二叉树的层平均值

给定一个非空二叉树, 返回一个由每层节点平均值组成的数组。

/**
 * 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<double> averageOfLevels(TreeNode* root) {
        vector<double> result;
        queue<TreeNode *> que;
        TreeNode * p = root;
        int size;
        double sum;
        if(p != nullptr)
            que.push(p);
        while(!que.empty()){
            size = que.size();
            sum = 0.0;
            for(int i = 0; i < size; ++i){
                p = que.front();
                que.pop();
                sum += p->val;
                if(p->left != nullptr)
                    que.push(p->left);
                if(p->right != nullptr)
                    que.push(p->right);
            }
            result.push_back(sum/size);
        }
        return result;
    }
};

429.N叉树的层序遍历

给定一个 N 叉树,返回其节点值的层序遍历。 (即从左到右,逐层遍历)。

例如,给定一个 3叉树 :

返回其层序遍历:

[ [1], [3,2,4], [5,6] ]

/*
// Definition for a Node.
class Node {
public:
    int val;
    vector<Node*> children;

    Node() {}

    Node(int _val) {
        val = _val;
    }

    Node(int _val, vector<Node*> _children) {
        val = _val;
        children = _children;
    }
};
*/

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        queue<Node *> que;
        Node * p = root;
        vector<vector<int>> result;
        int size;
        if(p != nullptr)
            que.push(p);
        while(!que.empty()){
            size = que.size();
            vector<int> vec;
            for(int i = 0; i < size; ++i){
                p = que.front();
                que.pop();
                vec.push_back(p->val);
                for(vector<Node *>::iterator it = p->children.begin(); it != p->children.end(); ++it){
                    if(*it != nullptr)
                        que.push(*it);
                }
            }
            result.push_back(vec);
        }
        return result;
    }
};

515.在每个树行中找最大值

您需要在二叉树的每一行中找到最大的值。

/**
 * 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> largestValues(TreeNode* root) {
        queue<TreeNode *> que;
        vector<int> result;
        TreeNode * p = root;
        int max;
        int size;
        if(p != nullptr)
            que.push(p);
        while(!que.empty()){
            size = que.size();
            max = INT_MIN;
            for(int i = 0; i < size; ++i){
                p = que.front();
                que.pop();
                if(max < p->val)
                    max = p->val;
                if(p->left != nullptr)
                    que.push(p->left);
                if(p->right != nullptr)
                    que.push(p->right);
            }
            result.push_back(max);
        }
        return result;
    }
};

116.填充每个节点的下一个右侧节点指针

给定一个完美二叉树,其所有叶子节点都在同一层,每个父节点都有两个子节点。二叉树定义如下:
struct Node {
int val;
Node *left;
Node *right;
Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL。

初始状态下,所有 next 指针都被设置为 NULL。

/*
// Definition for a Node.
class Node {
public:
    int val;
    Node* left;
    Node* right;
    Node* next;

    Node() : val(0), left(NULL), right(NULL), next(NULL) {}

    Node(int _val) : val(_val), left(NULL), right(NULL), next(NULL) {}

    Node(int _val, Node* _left, Node* _right, Node* _next)
        : val(_val), left(_left), right(_right), next(_next) {}
};
*/

class Solution {
public:
    Node* connect(Node* root) {
        queue<Node *> que;
        Node * p;
        int size;
        if(root != nullptr)
            que.push(root);
        while(!que.empty()){
            p = nullptr;
            size = que.size();
            for(int i = 0; i < size; ++i){
                if(p != nullptr)
                    p->next = que.front();
                p = que.front();
                que.pop();
                if(p->left != nullptr)
                    que.push(p->left);
                if(p->right != nullptr)
                    que.push(p->right);
            }
            p->next = nullptr;
        }
        return root;
    }
};

117.填充每个节点的下一个右侧节点指针II

与116同样的解决方法,同样的代码。

104.二叉树的最大深度

给定一个二叉树,找出其最大深度。

二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。

说明: 叶子节点是指没有子节点的节点。

示例:

给定二叉树 [3,9,20,null,null,15,7],

返回它的最大深度 3 。

/**
 * 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:
    int maxDepth(TreeNode* root) {
        int depth = 0;
        queue<TreeNode *> que;
        TreeNode * p;
        int size;
        if(root != nullptr)
            que.push(root);
        while(!que.empty()){
            size = que.size();
            depth++;
            for(int i = 0; i < size; ++i){
                p = que.front();
                que.pop();
                if(p->left != nullptr)
                    que.push(p->left);
                if(p->right != nullptr)
                    que.push(p->right);
            }
        }
        return depth;
    }
};

111.二叉树的最小深度

给定一个二叉树,找出其最小深度。

最小深度是从根节点到最近叶子节点的最短路径上的节点数量。

说明:叶子节点是指没有子节点的节点。

输入:root = [3,9,20,null,null,15,7]
输出:2

/**
 * 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:
    int minDepth(TreeNode* root) {
        queue<TreeNode *> que;
        int depth = 0;
        TreeNode * p;
        int size;
        if(root != nullptr)
            que.push(root);
        while(!que.empty()){
            size = que.size();
            depth++;
            for(int i = 0; i < size; ++i){
                p = que.front();
                que.pop();
                if(p->left == nullptr && p->right == nullptr)
                    return depth;
                else{
                    if(p->left != nullptr)
                        que.push(p->left);
                    if(p->right != nullptr)
                        que.push(p->right);
                }
            }
        }
        return depth;
    }
};
posted @ 2025-02-08 09:54  arbiter9  阅读(28)  评论(0)    收藏  举报