二叉树
Jelly_Believer
这个作者很懒,什么都没留下…
展开
-
mindmaster
原创 2021-10-15 10:54:55 · 145 阅读 · 0 评论 -
二叉搜索树的插入&& 删除&&修剪
class Solution { public: TreeNode* insertIntoBST(TreeNode* root, int val) { if(root == NULL){ TreeNode* node = new TreeNode(val); return node; } if(root->val > val) root->left = insertIntoBST(r.原创 2021-10-12 16:38:15 · 51 阅读 · 0 评论 -
二叉树的最近公共祖先&&二叉搜索树的最近公共祖先
自底向上寻找,即回溯,二叉树回溯的过程即是自底向上,而后序遍历就是天然的回溯过程。 怎么判断一个结点是结点q和结点p的公共祖先呢:如果找到一个结点,其左子树出现结点q ,右子树出现结点p,或者反之,则,该结点即位结点p和q的最近公共祖先 确定返回值类型: class Solution { public: TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) { if(root ==...原创 2021-10-11 16:57:00 · 50 阅读 · 0 评论 -
二叉树的构造:从中序和后序序列构造二叉树(前序遍历)
一层层切割,故想到递归 如果数组大小为0,说明是空结点了 如果不为空,则去后序数组最后一个元素作为节点元素 找到后序数组最后一个元素在中序数组的位置,作为切割点 切割中序数组,切割为中序左数组和中序右数组(一定是先切割中序数组) 切割后序数组,切为后序左数组和后序右数组 递归处理左区间和右区间 中序数组大小一定是和后序数组的大小相同的(这是必然)。 故可以根据切好的中序来分割后序 class Solution { public: //inorder.size() == postorder.size.原创 2021-10-09 10:25:21 · 664 阅读 · 1 评论 -
二叉树左叶子之和(后序遍历)
通过一个flag来判断当前进入的是不是左结点 class Solution { public: int res = 0; void traverse(TreeNode* root, int flag){ if(!root) return; if(flag && root->left == NULL && root->right == NULL){ res += root->.原创 2021-10-08 19:09:07 · 120 阅读 · 0 评论 -
二叉树的层次遍历系列
方法一: class Solution { public: vector<vector<int>> levelOrder(TreeNode* root) { if(!root) return {}; vector<vector<int> > res; queue<pair<TreeNode*, int> > q; int level = 0, lvl = 0; .原创 2021-10-05 10:12:50 · 78 阅读 · 0 评论 -
二叉树的迭代遍历
前序遍历 前序是中左右,每次先处理根节点,然后分别把右和左孩子加入栈中(先右再左,这样出栈就是先左再右) 代码(空节点不入栈) class Solution { public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*> st; vector<int> result; if (root == NULL) return resul原创 2021-10-04 10:17:10 · 54 阅读 · 0 评论 -
110.平衡二叉树 AND 104.二叉树的最大深度 AND 111. 二叉树的最小深度
首先明确概念: 二叉树的高度:叶子节点到当前节点的节点数 二叉树的深度:根节点到当前节点的节点数 故求高度可用后序遍历,而深度可用前序遍历 class Solution { public: // 返回以该节点为根节点的二叉树的高度,如果不是二叉搜索树了则返回-1 int getDepth(TreeNode* node) { if (node == NULL) { return 0; } int leftDepth .原创 2021-08-25 09:44:52 · 355 阅读 · 0 评论 -
二叉搜索树问题:Leetcode1373. 二叉搜索子树的最大键值和(二叉搜索树 + 后序遍历)
class Solution { public: int maxSum = 0; int maxSumBST(TreeNode* root) { traverse(root); return maxSum; } vector<int> traverse(TreeNode* root){ //base case if(!root) return {1, INT_MAX, INT_MIN, 0};.原创 2021-08-05 18:41:15 · 76 阅读 · 0 评论 -
Leetcode 98. 验证二叉搜索树
思路: 二叉搜索树在中序遍历下,结果是递增的。(二叉搜索树不能有重复元素,二叉搜索树可以为空) solution1: class Solution { public: vector<int> record; void traverse(TreeNode* root){ if(root == NULL) return; traverse(root->left); record.push_back(..原创 2021-08-03 19:44:08 · 69 阅读 · 0 评论 -
2021-07-31 Disjkstra
分析:从k结点传输到所有结点的时间 = max(k到1结点所需最短时间,k到2结点所需最短时间…从k到n所需最短时间),因为传输是同时的,所以这道题就转换为图的最短路径问题 先用Disjkstra算法求出各个点到k的最短距离,然后求出这些距离中的最大值 int networkDelayTime(vector<vector<int>>& times, int n, int k){ queue<int> myQue; //此队列用于即将访问的结点 ..原创 2021-07-31 18:34:22 · 77 阅读 · 0 评论 -
Leetcode 最小高度树
拓扑排序法 步骤:每次·删除所有当前入度为1的结点,直到最后剩下的节点数<=2 原理: 1.删除度为1的结点:相当于剪去所有当前的叶节点,最小高度树的层数必然下降一层 (1)所以最小高度树的高度等于(删除次数+剩下结点数)(假设只有一个结点时高度为1) 2.最后结点数 <= 2 (1)最后剩下一个结点,则该节点为唯一解 (2)最后剩下两个结点:以这两个结点为根的树都是最小高度树 (3)最后剩下三个结点:那么必然有两个度为1的结点和一个度大于1的结点,可再次通过删除所有度为1的结点进而使得树的..原创 2021-07-31 17:26:20 · 126 阅读 · 0 评论 -
leetcode 二叉树的所有路径(回溯 + 递归)&&路径总和
递归函数参数与返回值 结论:如果需要搜索整颗二叉树,则递归函数就不要返回值,如果要搜索其中一条符合条件的路径,递归函数就需要返回值,因为遇到符合条件的路径了就要及时返回。 递归终止条件 如果targetSum == 0, 同时到了叶子结点,说明找到了;否则若不为0到了叶子结点,说明没有找到。 确定单层递归逻辑 class Solution { public: bool hasPathSum(TreeNode* root, int targetSum) { if(...原创 2021-07-25 08:42:31 · 236 阅读 · 0 评论 -
LeetCode 二叉树的层序遍历II
vector<vector<int> > levelOrderBottom(TreeNode* root){ vector<vector<int> > res; if(root == NULL) return res; queue<TreeNode* >q; q.push(root); while(!q.empty()){ int size = q.size(); vector<int> tmp; .原创 2021-07-24 14:14:50 · 47 阅读 · 0 评论 -
LeetCode 对称二叉树
递归三步曲: 确定参数和返回值 因为要比较的是根节点的两个子树是否是相互翻转的,所以要比较的是两个树,参数自然就是左子树结点和右子树结点 bool compare(TreeNode* left, TreeNode* right) 递归终止条件 (1)有点为空 (2)结点都不为空则比较两者是否相等 if (left == NULL && right != NULL) return false; else if (left != NULL && right == N..原创 2021-07-23 19:41:57 · 63 阅读 · 0 评论