![](https://img-blog.csdnimg.cn/20201014180756923.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
Kalv1n
这个作者很懒,什么都没留下…
展开
-
[ 二叉树 ] 有序数组转化为平衡二叉搜索树
108. 将有序数组转换为二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)有序数组转化为平衡二叉搜索树递归将数组按中点分治递归自然构造成平衡二叉搜索树平衡来源于中点分治搜索树来自于有序,利用的是二叉搜索树的性质,和递归体中遍历方式无关class Solution {public: TreeNode* traversal(vector<int>& nums, int left, int right) { // 递归边界原创 2021-07-22 15:14:06 · 118 阅读 · 0 评论 -
[ 二叉树 ] 修剪二叉搜索树
669. 修剪二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)修剪二叉搜索树递归一棵树当前结点值小于low,那么保留右子树一棵树当前节点值大于high,那么保留左子树一棵树当前节点值在[low, high] 之间, 保留当前树。class Solution {public: TreeNode* trimBST(TreeNode* root, int low, int high) { // 修剪到空结点时返回 if (!ro原创 2021-07-22 15:13:29 · 100 阅读 · 0 评论 -
[ 二叉树 ] 删除搜索二叉树中的结点
450. 删除二叉搜索树中的节点 - 力扣(LeetCode) (leetcode-cn.com)删除搜索二叉树中的结点递归没有孩子,直接删除没左树,右树补;没右树,左树补左右树都存在,左树补到右树最左结点的左边; 或右树补到左树最右结点的右边class Solution {public: TreeNode* deleteNode(TreeNode* root, int key) { if (!root) return nullptr; // 寻找删除点原创 2021-07-22 15:12:53 · 79 阅读 · 0 评论 -
[ 二叉树 ] 二叉搜索树中的插入操作
701. 二叉搜索树中的插入操作 - 力扣(LeetCode) (leetcode-cn.com)二叉搜索树中的插入操作递归多说一句: Leetcode提供的默认函数并不是确定的, 我们函数的返回值和参数需要我们自己思考。比如,我们要插入一个结点,我们要找到新结点,此处是null;我们要找到位置的父结点。此时我们在找到结点时返回父结点就很简单。所以我们要根据我们要干什么先确定参数和返回值class Solution {public: TreeNode* insertIntoBST(原创 2021-07-22 15:12:06 · 257 阅读 · 0 评论 -
[ 二叉树 ] 二叉搜索树转换为累加树
538. 把二叉搜索树转换为累加树 - 力扣(LeetCode) (leetcode-cn.com)二叉搜索树转换为累加树递归重要思想: 前序中序后序不是唯一,按我们的想法选择 中 左 右, 中 右 左, 左 中 右, 右 中 左, 左 右 中, 右 左 中 合适的来解class Solution {public: int pre; void traversal(TreeNode* cur) { // 递归边界 if (!cur) return原创 2021-07-22 15:11:35 · 77 阅读 · 0 评论 -
[ 二叉树 ] 二叉树的最近公共祖先
236. 二叉树的最近公共祖先 - 力扣(LeetCode) (leetcode-cn.com)二叉树的最近公共祖先递归自底向上回溯后序遍历class Solution {public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { // 自底向上 == 回溯 == 后序遍历 if (!root || root == p || root == q)原创 2021-07-21 21:03:41 · 71 阅读 · 0 评论 -
[ 二叉树 ] 二叉搜索树中的众数
501. 二叉搜索树中的众数 - 力扣(LeetCode) (leetcode-cn.com)二叉搜索树中的众数递归该非严格意义上的二叉搜索树的**中序遍历结果是不严格递增**的保存上次访问指针class Solution {public: int maxCount; int count; TreeNode* pre; vector<int> ans; void searchBST(TreeNode* cur) { if (原创 2021-07-21 21:03:03 · 117 阅读 · 0 评论 -
[ 二叉树 ] 二叉搜索树的最小绝对差
530. 二叉搜索树的最小绝对差 - 力扣(LeetCode) (leetcode-cn.com)二叉搜索树的最小绝对差递归二叉搜索树的**中序遍历结果是严格递增**的保存中序遍历向量再处理class Solution {public: // 向量保存中序遍历结果 vector<int> value; // 中序遍历 void traversal(TreeNode* root) { if (!root) return;原创 2021-07-21 21:02:26 · 71 阅读 · 0 评论 -
[ 二叉树 ] 验证二叉搜索树
98. 验证二叉搜索树 - 力扣(LeetCode) (leetcode-cn.com)验证二叉搜索树递归二叉搜索树的**中序遍历结果是严格递增**的测试用例中最小取到了LONG_MINclass Solution {public: // 对于第一次比较,我们需要找到一个测试用例中的最小值 long max = LONG_MIN; bool isValidBST(TreeNode* root) { if (!root) return true;原创 2021-07-21 21:01:51 · 80 阅读 · 0 评论 -
[ 二叉树 ] 二叉搜索树中的搜索
700. 二叉搜索树中的搜索 - 力扣(LeetCode) (leetcode-cn.com)二叉搜索树中的搜索二叉搜索树(BST)定义二叉搜索树的左子树(非空)上所有结点值均小于根结点值二叉搜索树的右子树(非空)上所有结点值均大于根结点值二叉搜索树的子树仍为二叉搜索树递归前序遍历class Solution {public: TreeNode* searchBST(TreeNode* root, int val) { if (!root) return n原创 2021-07-21 21:00:52 · 74 阅读 · 0 评论 -
[ 二叉树 ] 合并二叉树
617. 合并二叉树 - 力扣(LeetCode) (leetcode-cn.com)合并二叉树递归不存在子树对当前树的影响,遍历方式任意class Solution {public: TreeNode* mergeTrees(TreeNode* root1, TreeNode* root2) { if (!root1) return root2; if (!root2) return root1; // 注意返回值可能是原root1, 可以是原创 2021-07-21 21:00:13 · 66 阅读 · 0 评论 -
[ 二叉树 ] 最大二叉树
654. 最大二叉树 - 力扣(LeetCode) (leetcode-cn.com)最大二叉树递归明确: 分治左闭右开原则vector使用下标代替分割优化空间class Solution {public: TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return traversal(nums, 0, nums.size()); } TreeNode* tra原创 2021-07-21 20:59:34 · 96 阅读 · 0 评论 -
[ 二叉树 ] 中序和后序遍历确定二叉树
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) (leetcode-cn.com)中序和后序遍历确定二叉树递归明确:分治左闭右开切割class Solution {public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { // 构造返回值 TreeNode* root = new TreeNode原创 2021-07-21 20:59:02 · 885 阅读 · 0 评论 -
[ 二叉树 ] 最大二叉树
654. 最大二叉树 - 力扣(LeetCode) (leetcode-cn.com)最大二叉树递归明确: 分治左闭右开原则vector使用下标代替分割优化空间class Solution {public: TreeNode* constructMaximumBinaryTree(vector<int>& nums) { return traversal(nums, 0, nums.size()); } TreeNode* tra原创 2021-07-21 14:03:17 · 66 阅读 · 0 评论 -
[ 二叉树 ] 中序和后序遍历确定二叉树
106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode) (leetcode-cn.com)中序和后序遍历确定二叉树递归明确:分治左闭右开切割class Solution {public: TreeNode* buildTree(vector<int>& inorder, vector<int>& postorder) { // 构造返回值 TreeNode* root = new TreeNode原创 2021-07-21 14:01:54 · 728 阅读 · 0 评论 -
[ 二叉树 ] 完全二叉树结点个数
222. 完全二叉树的节点个数 - 力扣(LeetCode) (leetcode-cn.com)完全二叉树结点个数递归(遍历法)当前树结点个数 = 左树 + 右树 + 1隐含了后序遍历class Solution {public: int countNodes(TreeNode* root) { if (!root) return 0; //先左 后右 最后中(+1) return 1 + countNodes(root->原创 2021-07-20 18:36:04 · 300 阅读 · 0 评论 -
[ 二叉树 ] 平衡二叉树
110. 平衡二叉树 - 力扣(LeetCode) (leetcode-cn.com)平衡二叉树深度:根节点到某节点的最⻓简单路径边的条数高度:某结点到叶子的最长简单路径边的条数树的深度(最深) == 树的高度(最高),那么按深度求class Solution {public: int getDepth(TreeNode* node) { if (!node) return 0; // 如果子树不平衡,那么整体不平衡原创 2021-07-20 18:35:21 · 82 阅读 · 0 评论 -
[ 二叉树 ] 左叶子之和
404. 左叶子之和 - 力扣(LeetCode) (leetcode-cn.com)左叶子之和递归当前树的左叶子之和 != 左右子树左叶子之和的和当前树的左叶子之和 == 左右子树左叶子之和的和 + 当前点唯一判断的左叶子class Solution {public: int sumOfLeftLeaves(TreeNode* root) { if (!root) return 0; // 一个结点可以唯一判断一个左叶子 int l原创 2021-07-20 18:34:43 · 130 阅读 · 0 评论 -
[ 二叉树 ] 找树左下角的值
513. 找树左下角的值 - 力扣(LeetCode) (leetcode-cn.com)找树左下角的值非递归非递归方式显然容易,不考虑递归方式层序遍历即可class Solution {public: int findBottomLeftValue(TreeNode* root) { int ans = root->val; queue<TreeNode*> que; que.push(root);原创 2021-07-20 18:34:15 · 110 阅读 · 0 评论 -
[ 二叉树 ] 路径总和
路径总和递归DFSclass Solution {public: bool hasPathSum(TreeNode* root, int targetSum) { // 递归边界,叶子和NULL if (!root) return false; if (!root->left && !root->right && targetSum == root->val) return true;原创 2021-07-20 18:33:41 · 75 阅读 · 0 评论 -
[ 二叉树 ] 二叉树最大深度
二叉树的最大深度104. 二叉树的最大深度 - 力扣(LeetCode) (leetcode-cn.com)递归当前树深度 = 左右子树的较大值 + 1隐含了后序遍历class Solution {public: int maxDepth(TreeNode* root) { if (!root) return 0; //先左 后右 最后中(+1) return 1 + max(maxDepth(root->left), maxDe原创 2021-07-20 18:33:07 · 77 阅读 · 0 评论 -
[ 二叉树 ] 二叉树所有路径
257. 二叉树的所有路径 - 力扣(LeetCode) (leetcode-cn.com)二叉树所有路径递归DFS有 递归 就有 回溯class Solution {public: void DFS(TreeNode* node, vector<int>& path, vector<string>& ans) { // 压入当前访问点 path.push_back(node->val);原创 2021-07-20 18:32:01 · 125 阅读 · 0 评论 -
[ 二叉树 ] 对称二叉树
101. 对称二叉树 - 力扣(LeetCode) (leetcode-cn.com)对称二叉树递归明确:不是简单的 访问+处理 组合,子树对称和父树对称无关 (类似各种遍历)对称不是左右孩子对称,对称判断是考虑左右子树是否为翻转二叉树,递归体以子树为参数排除法感受整个递归过程的层次感class Solution {public: bool compare(TreeNode* left, TreeNode* right) { // 注意不是左右子树,是左边的树和对原创 2021-07-19 17:54:33 · 111 阅读 · 0 评论 -
[ 二叉树 ] 翻转二叉树
递归翻转二叉树递归遍历翻转class Solution {public: TreeNode* invertTree(TreeNode* root) { if (root == nullptr) return root; // 前序递归 swap(root->left, root->right); // 翻转 invertTree(root->left); invertTre原创 2021-07-19 15:39:57 · 153 阅读 · 0 评论 -
[ 二叉树 ] 二叉树遍历(递归+非递归)代码实现
二叉树遍历递归写法递归思想前序、中序、后序的定义前序遍历class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> ans; preorder(root, ans); return ans; } void preorder(TreeNode* root, vector<int>&a原创 2021-07-19 15:28:36 · 139 阅读 · 0 评论