代码随想录day13二叉树1

文章目录

  • 二叉树的递归遍历
    • 二叉树前序遍历
    • 二叉树后序遍历
    • 二叉树中序遍历
  • 二叉树层序遍历
    • 102.二叉树的层序遍历
    • 107. 二叉树的层序遍历 II
    • 199. 二叉树的右视图
    • 637. 二叉树的层平均值
    • 429.N叉树的层序遍历
    • 515.在每个树行中找最大值
    • 116.填充每个节点的下一个右侧节点指针
    • 117.填充每个节点的下一个右侧节点指针II
    • 104.二叉树的最大深度
    • 111.二叉树的最小深度

二叉树的递归遍历

文章讲解
确定递归函数的参数和返回值: 确定哪些参数是递归的过程中需要处理的,那么就在递归函数里加上这个参数, 并且还要明确每次递归的返回值是什么进而确定递归函数的返回类型。

确定终止条件: 写完了递归算法, 运行的时候,经常会遇到栈溢出的错误,就是没写终止条件或者终止条件写的不对,操作系统也是用一个栈的结构来保存每一层递归的信息,如果递归没有终止,操作系统的内存栈必然就会溢出。

确定单层递归的逻辑: 确定每一层递归需要处理的信息。在这里也就会重复调用自己来实现递归的过程。

二叉树前序遍历

题目链接

/**
 * 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 front(TreeNode* cur,vector<int>& res)
    {
        if(cur==NULL) return ;
        res.push_back(cur->val);
        front(cur->left,res);
        front(cur->right,res);
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;
        front(root,ans);
        return ans;
    }
};

二叉树后序遍历

题目链接

/**
 * 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 rear(TreeNode* cur,vector<int>& res)
    {
        if(cur==NULL) return;
        rear(cur->left,res);
        rear(cur->right,res);
        res.push_back(cur->val);
    }
    vector<int> postorderTraversal(TreeNode* root) {
        vector<int> ans;
        rear(root,ans);
        return ans;
    }
};

二叉树中序遍历

题目链接

/**
 * 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 mid(TreeNode* cur,vector<int>& res)
    {
        if(cur==NULL) return;
        mid(cur->left,res);
        res.push_back(cur->val);
        mid(cur->right,res);
       
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;
        mid(root,ans);
        return ans;
    }
};

二叉树层序遍历

文章讲解

102.二叉树的层序遍历

题目链接

/**
 * 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*> q;
        if(root!=NULL)
        {
            q.push(root);
        }
        vector<vector<int>> ans;
        while(!q.empty())
        {
            int k=q.size();
            vector<int> res;
            while(k--)
            {
                TreeNode* node=q.front();
                q.pop();
                res.push_back(node->val);
                if(node->left!=NULL) q.push(node->left);
                if(node->right!=NULL) q.push(node->right);
            }
            ans.push_back(res);
            res.clear();
        }
        return ans;
    }
};

107. 二叉树的层序遍历 II

题目链接
将结果reverse一下即可

/**
 * 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>> levelOrderBottom(TreeNode* root) {
        queue<TreeNode*> q;
        if(root) q.push(root);
        vector<vector<int>> ans;
        while(!q.empty())
        {
            int k=q.size();
            vector<int> res;
            while(k--)
            {
                TreeNode* node=q.front();
                q.pop();
                res.push_back(node->val);
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            ans.push_back(res);
            res.clear();
        }
        reverse(ans.begin(),ans.end());
        return ans;
    }
};

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) {
         queue<TreeNode*> q;
        if(root) q.push(root);
         vector<int> res;
         bool flag=false;
        while(!q.empty())
        {
            int k=q.size();
           
            while(k--)
            {
                TreeNode* node=q.front();
                q.pop();
                if(k==0) res.push_back(node->val);//插入每行的最后一个元素
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
                
            }
           
        }
        return res;
    }
};

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) {
        queue<TreeNode*> q;
        if(root) q.push(root);
        vector<double> res;
        while(!q.empty())
        {
            int k=q.size();
            double ans=0;
            for(int i=0;i<k;i++)
            {
                TreeNode* node=q.front();
                q.pop();
                ans+=node->val;
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            res.push_back(ans/k);
        }
        return res;
    }
};

429.N叉树的层序遍历

题目链接

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

    Node() {}

    Node(int _val) {
        val = _val;
    }

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

class Solution {
public:
    vector<vector<int>> levelOrder(Node* root) {
        queue<Node*> q;
        if(root!=NULL)
        {
            q.push(root);
        }
        vector<vector<int>> ans;
        while(!q.empty())
        {
            int k=q.size();
            vector<int> res;
            while(k--)
            {
                Node* node=q.front();
                q.pop();
                res.push_back(node->val);
               for(int i=0;i<node->children.size();i++)
               {
               if(node->children[i]) q.push(node->children[i]);
               }
            }
            ans.push_back(res);
            res.clear();
        }
        return ans;
    }
};

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*> q;
        if(root) q.push(root);
        vector<int> res;
        while(!q.empty())
        {
            int k=q.size();
            int ans=INT_MIN;
            for(int i=0;i<k;i++)
            {
                TreeNode* node=q.front();
                q.pop();
                ans=max(ans,node->val);
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            res.push_back(ans);
        }
        return res;
    }
};

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

题目链接

/*
// 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*> q;
        if(root) q.push(root);
        vector<int> res;
        while(!q.empty())
        {
            int k=q.size();
            Node* node=new Node();
            Node* prenode=new Node();
            for(int i=0;i<k;i++)
            {
                if(i==0)
                {
                    prenode=q.front();
                    q.pop();
                    node=prenode;
                }
                else{
                    node=q.front();
                    prenode->next=node;
                    q.pop();
                    prenode=node;
                }
                
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            
        }
        return root;
    }
};

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

题目链接
代码和上一个题一样的 区别在于是不是满二叉树

104.二叉树的最大深度

题目链接

/**
 * 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) {
        queue<TreeNode*> q;
        if(root) q.push(root);
        vector<int> res;
        int ans=0;
        while(!q.empty())
        {
            int k=q.size();
            for(int i=0;i<k;i++)
            {
                TreeNode* node=q.front();
                q.pop();
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
            ans++;
        }
        return ans;
    }
};

111.二叉树的最小深度

题目链接

/**
 * 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*> q;
        if(root) q.push(root);
        vector<int> res;
        int ans=0;
        while(!q.empty())
        {
            int k=q.size();
             ans++;
            for(int i=0;i<k;i++)
            {
                TreeNode* node=q.front();
                q.pop();
                if(!node->left&&!node->right) return ans;
                if(node->left) q.push(node->left);
                if(node->right) q.push(node->right);
            }
           
        }
        return ans;
    }
};

你可能感兴趣的:(二叉树)