数据结构之---树

相关文档

需要掌握的二叉树技能都在这里了

数据结构

树节点的表示:

#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) 的时间内查找一个值是否存在:从根节点开始,若当前节点的值大于查找值
则向左下走,若当前节点的值小于查找值则向右下走。同时因为二叉查找树是有序的,对其中序
遍历的结果即为排好序的数组。
代码:

99. 恢复二叉搜索树

题目描述

输入输出样例

题解

669. 修剪二叉搜索树

题目描述

输入输出样例

题解

字典树

实现Trie(前缀树)

题目描述

输入输出样例

题解

翻转二叉树

题目描述

输入输出样例

题解

617. 合并二叉树

题目描述

输入输出样例

题解

572. 另一棵树的子树

题目描述

输入输出样例

题解

404. 左叶子之和

题目描述

输入输出样例

题解

513. 找树左下角的值

题目描述

输入输出样例

题解

538. 把二叉搜索树转换为累加树

题目描述

输入输出样例

题解

235. 二叉搜索树的最近公共祖先

题目描述

输入输出样例

题解

530. 二叉搜索树的最小绝对差

题目描述

输入输出样例

题解

889. 根据前序和后序遍历构造二叉树

题目描述

输入输出样例

题解

106. 从中序与后序遍历序列构造二叉树

题目描述

输入输出样例

题解

94. 二叉树的中序遍历

题目描述

输入输出样例

题解

145. 二叉树的后序遍历

题目描述

输入输出样例

题解

236. 二叉树的最近公共祖先

题目描述

输入输出样例

题解

109. 有序链表转换二叉搜索树

题目描述

输入输出样例

题解

897. 递增顺序查找树

题目描述

输入输出样例

题解

653. 两数之和 IV - 输入 BST

题目描述

输入输出样例

题解

450. 删除二叉搜索树中的节点

题目描述

输入输出样例

题解

剑指 Offer 07. 重建二叉树

题目描述

输入输出样例

题解

剑指 Offer 26. 树的子结构

题目描述

输入输出样例

题解

剑指 Offer 27. 二叉树的镜像

题目描述

输入输出样例

题解

剑指 Offer 28. 对称的二叉树

题目描述

输入输出样例

题解

剑指 Offer 32 - I. 从上到下打印二叉树

题目描述

输入输出样例

题解

剑指 Offer 32 - II. 从上到下打印二叉树 II

题目描述

输入输出样例

题解

剑指 Offer 32 - III. 从上到下打印二叉树 III

题目描述

输入输出样例

题解

剑指 Offer 33. 二叉搜索树的后序遍历序列

题目描述

输入输出样例

题解

剑指 Offer 34. 二叉树中和为某一值的路径

题目描述

输入输出样例

题解

剑指 Offer 36. 二叉搜索树与双向链表

题目描述

输入输出样例

题解

剑指 Offer 37. 序列化二叉树

题目描述

输入输出样例

题解

剑指 Offer 54. 二叉搜索树的第k大节点

题目描述

输入输出样例

题解

剑指 Offer 55 - I. 二叉树的深度

题目描述

输入输出样例

题解

剑指 Offer 55 - II. 平衡二叉树

题目描述

输入输出样例

题解

剑指 Offer 68 - I. 二叉搜索树的最近公共祖先

题目描述

输入输出样例

题解

剑指 Offer 68 - II. 二叉树的最近公共祖先

题目描述

输入输出样例

题解

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值