力扣经典二叉树题目

简介: 力扣经典二叉树题目

144. 二叉树的前序遍历


144. 二叉树的前序遍历


描述:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。

8738ed2dab1dd3fba1d8df231bcfc765_c998ea9aedbb46e998dfa13457394346.png


656a5573b1945ec079efa0dfd53a0b27_01ffa854e14e4e5b8a1caf214c6d1cab.png


解题思路:


1)若树为空,直接返回 NULL。

2)访问根结点,存下结点的值。

3)递归左子树。

4)递归右子树。


参考代码:


/**
 * 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 preorder(TreeNode *root, vector<int> &ans) { //前序遍历
        if (root == nullptr) return;      //判断是否为空
        ans.push_back(root -> val); 
        preorder(root -> left, ans);      //递归左子树
        preorder(root -> right, ans);     //递归右子树
        return;
    }
    vector<int> preorderTraversal(TreeNode* root) {
        vector<int> ans;        //结果数组
        preorder(root, ans);    //前序遍历
        return ans;             //返回
    }
};


94. 二叉树的中序遍历


94. 二叉树的中序遍历


描述:给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。


c4852c72fa6e7d0b9f7bf1ca64b79340_5c4c77a86fea41bdac64e6bb30f22d8c.png


解题思路:


1)若树为空,直接返回 NULL。

2)递归左子树。

3)访问根结点,存下结点的值。

4)递归右子树。


参考代码:


/**
 * 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 inorder(TreeNode* root, vector<int>& ans) {//中序遍历
        if (!root) return;            //判断是否为空
        inorder(root->left, ans);     //递归左子树
        ans.push_back(root->val);
        inorder(root->right, ans);    //递归右子树
    }
    vector<int> inorderTraversal(TreeNode* root) {
        vector<int> ans;               //结果数组
        inorder(root, ans);            //中序遍历
        return ans;                    //返回
    }
};


145. 二叉树的后序遍历


145. 二叉树的后序遍历


描述:给你一棵二叉树的根节点 root ,返回其节点值的 后序遍历 。


c26c708c367974423731eb1b5a3e19aa_66b7fcdf15d8444f87a0be45a5d204fe.png


解题思路:


1)若树为空,直接返回 NULL。

2)递归左子树。

3)递归右子树。

4)访问根结点,存下结点的值。


参考代码:


/**
 * 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 postorder(TreeNode *root, vector<int> &ans) {//后序遍历
        if (root == nullptr) return;        //判断是否为空
        postorder(root->left, ans);         //遍历左子树
        postorder(root->right, ans);        //遍历右子树
        ans.push_back(root->val);
    }
    vector<int> postorderTraversal(TreeNode *root) {
        vector<int> ans;                    //答案数组
        postorder(root, ans);               //后序遍历
        return ans;                         //返回
    }
};


102. 二叉树的层序遍历


102. 二叉树的层序遍历


描述:给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。

d36aec600bed7b56f084930a1d43045b_4a25a13532694ccba6c6b143a1544013.png


解题思路:  


1)若树非空,创建辅助队列,头结点入队。

2)将队头结点储存下来记作结点 node,记录结点数据,然后进行出队操作。

3)将结点 node 的左右孩子进行入队操作。

4)重复操作至队列为空。


参考代码:


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


104. 二叉树的最大深度


104. 二叉树的最大深度


描述:


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


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


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


adbd4285209f6cfa438346ed2d6a2645_9fe753f339444037b95eef9ba2e57761.png


解题思路:


1)当遇到空结点时,返回 0。

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 maxDepth(TreeNode* root) {
        if (root == nullptr) return 0;
        return max(maxDepth(root->left), maxDepth(root->right)) + 1;
    }
};

相关文章
|
3月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
57 6
|
1月前
|
程序员 C语言
【C语言】LeetCode(力扣)上经典题目
【C语言】LeetCode(力扣)上经典题目
|
1月前
【LeetCode 31】104.二叉树的最大深度
【LeetCode 31】104.二叉树的最大深度
20 2
|
1月前
【LeetCode 29】226.反转二叉树
【LeetCode 29】226.反转二叉树
16 2
|
1月前
【LeetCode 28】102.二叉树的层序遍历
【LeetCode 28】102.二叉树的层序遍历
16 2
|
1月前
【LeetCode 43】236.二叉树的最近公共祖先
【LeetCode 43】236.二叉树的最近公共祖先
20 0
|
1月前
【LeetCode 38】617.合并二叉树
【LeetCode 38】617.合并二叉树
15 0
|
1月前
【LeetCode 37】106.从中序与后序遍历构造二叉树
【LeetCode 37】106.从中序与后序遍历构造二叉树
17 0
|
1月前
【LeetCode 34】257.二叉树的所有路径
【LeetCode 34】257.二叉树的所有路径
18 0
|
1月前
【LeetCode 32】111.二叉树的最小深度
【LeetCode 32】111.二叉树的最小深度
17 0