文章目录

  • 一、算法核心思想
  • 二、算法模型
    • (一)回溯
      • 1.[104.二叉树的最大深度](https://leetcode.cn/problems/maximum-depth-of-binary-tree/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析
      • 2.[144.二叉树的前序遍历](https://leetcode.cn/problems/binary-tree-preorder-traversal/description/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析
      • 3.[543.二叉树的直径](https://leetcode.cn/problems/diameter-of-binary-tree/description/)
        • (1)思路
        • (2)代码
        • (3)复杂度分析

一、算法核心思想

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个节点最多只能有两棵子树,且有左右之分!
快速排序就是个二叉树的前序遍历,归并排序就是个二叉树的后序遍历。

二、算法模型

(一)回溯

1.104.二叉树的最大深度

(1)思路

如果我们知道了左子树和右子树的最大深度 l 和 r,那么该二叉树的最大深度即为max(l,r)+1,而左子树和右子树的最大深度又可以以同样的方式进行计算。因此我们可以用「深度优先搜索」的方法来计算二叉树的最大深度。具体而言,在计算当前二叉树的最大深度时,可以先递归计算出其左子树和右子树的最大深度,然后在 O(1)时间内计算出当前二叉树的最大深度。递归在访问到空节点时退出。

(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)复杂度分析
  • 时间复杂度:O(n),其中 n 为二叉树节点的个数。每个节点在递归中只被遍历一次。
  • 空间复杂度:O(height),height表示二叉树的高度,递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。

2.144.二叉树的前序遍历

(1)思路
(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:void traversal(TreeNode* cur,vector <int> &vec) {if (cur == NULL) return;vec.push_back(cur -> val);traversal(cur -> left,vec);traversal(cur -> right,vec);}vector<int> preorderTraversal(TreeNode* root) {vector <int> result;traversal(root,result);return result;}};
(3)复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

3.543.二叉树的直径

(1)思路
(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 res = 0;int diameterOfBinaryTree(TreeNode* root) { maxDepth(root);return res;}int maxDepth(TreeNode* root) {if (root == nullptr)return 0;int leftMax = maxDepth(root -> left);int rightMax = maxDepth(root -> right);int myDia = leftMax + rightMax;res = max(res,myDia);return 1 + max(leftMax,rightMax);}};
(3)复杂度分析
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)