树
相关文档
数据结构
树节点的表示:
#include<iostream>
#include<string>
using namespace std;
// 二叉树的遍历算法
class Node {
public: // 可以看出,c++中class如果不加声明,其默认成员是私有的。
int v;
Node* left;
Node* right;
Node(int vs):v(vs),left(nullptr), right(nullptr){} // 注意这里的{}后不用加分号
};
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int v) :val(v), left(nullptr), right(nullptr) {}
};
104. 二叉树的最大深度
题目描述
输入输出样例
题解
class Solution {
public:
int Depth(TreeNode* root) {
if (root == nullptr) return 0;
return max(Depth(root->left), Depth(root->right)) + 1;
}
};
//复杂度分析
//时间复杂度:O(n),其中 nn 为二叉树节点的个数。每个节点在递归中只被遍历一次。
//空间复杂度:O(height),其中 height 表示二叉树的高度。递归函数需要栈空间,而栈空间取决于递归的深度,因此空间复杂度等价于二叉树的高度。
class Solution {
public:
int maxDepth(TreeNode* root) {
if (root == nullptr) return 0;
queue<TreeNode*> Q;
Q.push(root);
int ans = 0;
while (!Q.empty()) {
int sz = Q.size();
while (sz > 0) {
TreeNode* node = Q.front();Q.pop();
if (node->left) Q.push(node->left);
if (node->right) Q.push(node->right);
sz -= 1;
}
ans += 1;
}
return ans;
}
};
//复杂度分析
// 时间复杂度:O(n),其中 nn 为二叉树的节点个数。与方法一同样的分析,每个节点只会被访问一次。
// 空间复杂度:此方法空间的消耗取决于队列存储的元素数量,其在最坏情况下会达到 O(n)。
110. 平衡二叉树
题目描述
输入输出样例
题解
543. 二叉树的直径
题目描述
输入输出样例
题解
112. 路径总和
题目描述
输入输出样例
题解
113. 路径总和II
题目描述
输入输出样例
题解
437. 路径总和III
题目描述
输入输出样例
题解
257. 二叉树的所有路径
题目描述
输入输出样例
题解
101. 对称二叉树
题目描述
输入输出样例
题解
1110. 删点成林
题目描述
输入输出样例
题解
层次遍历:二叉树的层平均值
题目描述
输入输出样例
题解
前中后序遍历
// 前序遍历
void preorder(Node *root) {
if (root) {
visit(root);
preorder(root->left);
preorder(root->right);
}
}
// 中序遍历
void inorder(Node* root) {
if (root) {
inorder(root->left);
visit(root);
inorder(root->right);
}
}
// 后序遍历
void postorder(Node* root) {
if (root) {
postorder(root->left);
postorder(root->right);
visit(root);
}
}
105. 从前序与中序遍历序列构造二叉树
题目描述
输入输出样例
题解
144. 二叉树的前序遍历
题目描述
输入输出样例
题解
二叉查找树的实现
二叉查找树(Binary Search Tree, BST)是一种特殊的二叉树:对于每个父节点,其左子节点
的值小于等于父结点的值,其右子节点的值大于等于父结点的值。因此对于一个二叉查找树,我
们可以在 O(nlogn) 的时间内查找一个值是否存在:从根节点开始,若当前节点的值大于查找值
则向左下走,若当前节点的值小于查找值则向右下走。同时因为二叉查找树是有序的,对其中序
遍历的结果即为排好序的数组。
代码: