LC二叉树
二叉树
你别教我打游戏
直面困难,重视过程,追求结果,淡忘过去。
展开
-
二叉树的各种遍历(递归与迭代实现)以及使用中序、(前序 | 后序)还原二叉树
这里就用力扣上面的各种题目要模板了。二叉树的遍历层次遍历102. 二叉树的层序遍历class Solution {public: vector<vector<int>> levelOrder(TreeNode* root) { vector<vector<int>> ans; if(!root) return ans; queue<TreeNode*> q; q..原创 2020-10-21 21:42:07 · 147 阅读 · 0 评论 -
LeetCode 897. 递增顺序搜索树 (二叉树、递归、链表)
递增顺序搜索树class Solution {public: TreeNode *dump = new TreeNode, *pre = dump; TreeNode* increasingBST(TreeNode* node) { helper(node); return dump->right;; } void helper(TreeNode* node) { if(!node) return;原创 2021-04-25 14:41:41 · 73 阅读 · 0 评论 -
LeetCode 331. 验证二叉树的前序序列化 (二叉树、深搜、栈)
331. 验证二叉树的前序序列化模拟建树class Solution { String[] els; int pos = 0; public boolean isValidSerialization(String preorder) { els = preorder.split(","); return dfs() && pos == els.length-1; } boolean dfs(){原创 2021-03-12 14:47:21 · 66 阅读 · 0 评论 -
LeetCode 450. 删除二叉搜索树中的节点 (BST基本操作之删除)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: //找到某一棵子树中值最大的节点(前驱) TreeNo原创 2020-12-21 20:46:43 · 239 阅读 · 0 评论 -
LeetCode 116. 117 填充每个节点的下一个右侧节点指针 (小巧的递归、链表+二叉树)
116 填充每个节点的下一个右侧节点指针使用额外空间很好做递归写法class Solution {public: Node* connect(Node* root) { dfs(root,nullptr); return root; } void dfs(Node* cur,Node* nxt){ if(!cur) return; cur->next = nxt; dfs(cur->l原创 2020-10-15 18:12:52 · 79 阅读 · 0 评论 -
LeetCode 530. 二叉搜索树的最小绝对差(中序遍历O(1)空间复杂度)
二叉搜索树的最小绝对差如何做到O(1)O(1)O(1)空间复杂度?/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public:原创 2020-10-12 13:39:40 · 105 阅读 · 0 评论 -
LeetCode 257. 二叉树的所有路径 (回溯)
二叉树的所有路径分析一下时间复杂度:每个点都只会遍历一次,时间复杂度:O(n)O(n)O(n)。在最坏情况下,是一个满二叉树,时间复杂度:O(n∗log(n))O(n*log(n))O(n∗log(n))/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) :原创 2020-09-04 00:32:43 · 165 阅读 · 0 评论 -
LeetCode 1530. 好叶子节点对的数量(LCA、递归、后序遍历)
1530. 好叶子节点对的数量原创 2020-08-07 21:47:25 · 218 阅读 · 0 评论 -
LeetCode 100. 相同的树 (递归的判断)
相同的树 /** * 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)原创 2020-08-07 11:55:02 · 90 阅读 · 0 评论 -
LeetCode 99. 恢复二叉搜索树 (BST的中序遍历+线性时间里找到两个被颠倒的数字)
恢复二叉搜索树如何在线性开销里找到"近似排序"数组里颠倒的两个数字 //在线性开销里找到"近似排序"数组里颠倒的两个数字 for(int i=0;i<list.size()-1;i++){ if(list[i+1]<list[i]){ y = list[i+1]; if(x==-1) x = list[i]; else break;原创 2020-07-07 22:24:00 · 223 阅读 · 0 评论 -
LeetCode 690. 员工的重要性(树的遍历+哈希表)
员工的重要性/*// Definition for Employee.class Employee {public: int id; int importance; vector<int> subordinates;};*/class Solution {public: int getImportance(vector<Employee*> employees, int id) { unordered_map<i原创 2020-07-07 21:32:58 · 85 阅读 · 0 评论 -
LeetCode 1457. 二叉树中的伪回文路径(回溯、回文串的判定、位运算优化)
二叉树中的伪回文路径主要是伪回文串的判定:如果字符串是偶数、所有数字出现的次数必须是偶数。如果是奇数,有且只有一种数字的出现的是奇数/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {.原创 2020-07-07 15:29:53 · 186 阅读 · 0 评论 -
LeetCode 1261. 在受污染的二叉树中查找元素
在受污染的二叉树中查找元素方法一先用dfs自上而下地修改值。然后查找的某个的值时候,序列是确定的。比如,9->4->1->0。然后用迭代的方式去查询这个序列。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left原创 2020-07-06 17:11:00 · 174 阅读 · 0 评论 -
LeetCode 剑指 Offer 26. 树的子结构 (递归、递归的终止条件)
树的子结构/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool isSubStructure(TreeN原创 2020-07-05 23:23:42 · 113 阅读 · 0 评论 -
LeetCode 1026. 节点与其祖先之间的最大差值(三种时间复杂度)
双重递归时间复杂度:O(n2)O(n^2)O(n2)/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int原创 2020-07-02 20:55:15 · 183 阅读 · 0 评论 -
LeetCode 222. 完全二叉树的节点个数 (遍历+打编号)
完全二叉树的节点个数/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int ans = 0; int原创 2020-07-02 19:50:47 · 88 阅读 · 0 评论 -
LeetCode 1110. 删点成林 (二叉树节点的删除)
删点成林一个节点要被加入答案,情况应该是它的父亲节点要被删除了,而它自己不会被删除,这个时候才可以去添加到答案,并且要注意被删除节点的更新。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {原创 2020-07-01 21:56:58 · 216 阅读 · 0 评论 -
LeetCode 404. 左叶子之和(二叉树的遍历)
左叶子之和为了知道一个节点是否是父节点的子节点,需在遍历树的时候记录一下。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {publ原创 2020-07-01 20:39:23 · 146 阅读 · 0 评论 -
LeetCode 95. 不同的二叉搜索树 II (记忆化递归)
不同的二叉搜索树 II思路:对于一个序列,l,l+1,l+2……,r−2,r−1,rl,l+1,l+2……,r-2,r-1,rl,l+1,l+2……,r−2,r−1,r, 枚举每个值作为根节点,然后它左边的数字构建左子树、右边的数字构建右子树,然后两两组合。当然,也可以优化一下,进行记忆化递归。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left;原创 2020-07-01 19:37:03 · 101 阅读 · 0 评论 -
LeetCode 998. 最大二叉树 II(树的解析与树的重建)
最大二叉树 II相当于给定由一个序列构建一棵二叉树的规则,然后我们先用这棵树反序列化得出序列,然后再加上一个数字,再用新的序列去构建树。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode() : val(0), left(nullptr), right(nullptr) {}原创 2020-07-01 18:10:22 · 131 阅读 · 0 评论 -
LeetCode 1315. 祖父节点值为偶数的节点和 (遍历二叉树)
祖父节点值为偶数的节点和由于需要知道祖父节点的值,所以搜索的时候要带着祖父节点、父亲节点、以及当前节点。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class原创 2020-06-30 21:16:22 · 282 阅读 · 1 评论 -
LeetCode 700. 二叉搜索树中的搜索(BST基本操作之查找)
二叉搜索树中的搜索/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: TreeNode* searchBST(T原创 2020-06-27 19:23:19 · 214 阅读 · 0 评论 -
LeetCode 894. 所有可能的满二叉树 (递归的构造、记忆化递归)
所有可能的满二叉树这题的递归构造着实没想出来。。观察题给的样例,7个节点的满二叉树,左右子树的节点数目情况为:1、5 ; 3、3 ; 5、1;那如果共有5个节点呢,情况有:1、3 ; 3、1;那如果有 3个节点呢,情况有:1 1;那如果只有1个节点呢?直接返回一个根节点即可。上述的思维过程其实就是递归的思维过程。而且很明显发现,递归是有重复的,可以进行一下记忆化。/** * Definition for a binary tree node. * struct TreeNode {原创 2020-06-26 06:25:41 · 137 阅读 · 0 评论 -
LeetCode 590. N叉树的后序遍历 (递归、迭代实现)
N叉树的后序遍历递归:/*// Definition for a Node.class Node {public: int val; vector<Node*> children; Node() {} Node(int _val) { val = _val; } Node(int _val, vector<Node*> _children) { val = _val; ch原创 2020-06-25 21:33:54 · 171 阅读 · 0 评论 -
LeetCode 面试题 04.04. 检查平衡性 (双重递归)
检查平衡性/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: bool isBalanced(TreeNode*原创 2020-06-25 20:33:07 · 134 阅读 · 0 评论 -
LeetCode 437. 路径总和 III (起点、终点都不唯一的路径数目)
路径总和 III原创 2020-06-25 07:37:15 · 185 阅读 · 0 评论 -
LeetCode 113. 路径总和 II (回溯、路径记录)
路径总和 II 与112路径总和思路是一样的,只是在这里多了一个路径记录罢了。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {pu原创 2020-06-25 05:21:17 · 109 阅读 · 0 评论 -
LeetCode 112. 路径总和 (路径必须经过根节点和叶节点)
路径总和能够返回true的情况只有一种可能,就是在叶节点的时候,路径和刚好为目标值。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {原创 2020-06-25 04:54:34 · 129 阅读 · 0 评论 -
LeetCode 236. 二叉树的最近公共祖先(LCA、向上染色法、巧妙的递归)
二叉树的最近公共祖先求LCA的朴素做法:向上染色。先让一个节点不断向上,并标记父节点。然后让另一个节点也向上寻找,然后第一次遇到的已经染色节点就是LCA。具体做法:先BFS求出每个节点的父节点。用unordered_map<TreeNode*,TreeNode*>记录,如果要数字,直接用int fa[];然后用unordered_set<TreeNode*>记录染色的节点。如果是数字,可以用int vis[]时间复杂度:O(n)O(n)O(n)加以优化,就得到了树原创 2020-06-24 15:05:09 · 254 阅读 · 0 评论 -
LeetCode 235. 二叉搜索树的最近公共祖先 (利用二叉搜索树的有序的性质、递归||迭代)
二叉搜索树的最近公共祖先BST的性质(定义):①左子树的节点的值都比根节点值小。②右子树的节点的值都比根节点值大。③左子树、右子树都是BST。所以,假如p、q的值都比根节点的值要小,说明这个根节点还不是最近的,它的左子树的根可能更近。假如p、q的值都比根节点的值要大,说明这个它的右子树的根节点可能更近。如果一个大一个小,说明此时根节点已经是最近公共祖先了。当然此题也可以按照一般的二叉树做,繁一点递归实现:/** * Definition for a binary tree node.原创 2020-06-24 10:15:23 · 104 阅读 · 0 评论 -
LeetCode 508. 出现次数最多的子树元素和 (递归求和、哈希表记录)
出现次数最多的子树元素和/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: unordered_map<i原创 2020-06-23 20:48:20 · 106 阅读 · 0 评论 -
LeetCode 124. 二叉树中的最大路径和 (树形DP、递归实现)
二叉树中的最大路径和 /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {public: int ans = INT_MIN;原创 2020-06-21 04:04:18 · 204 阅读 · 0 评论 -
LeetCode 1028. 从先序遍历还原二叉树(递归建树、切割序列)
做此题的思路和用 中序遍历和前(后)序遍历重建二叉树的思路是非常一致的。从序列中找出根节点、左子树、右子树——不断切割序列,递归地向下建树——而确定根节点和左右子树根节点的依据就是深度。时间复杂度:O(S.length)O(S.length)O(S.length)但是不知道为什么这么慢啊/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; *原创 2020-06-18 03:53:48 · 109 阅读 · 0 评论 -
LeetCode 429. N叉树的层序遍历 (多叉树的存储结构、队列实现)
N叉树的层序遍历注意:一般一棵多叉树的结构:其中边长数组便于存储不定长的子节点。class Node{ int val; vector<Node*> children;};而字典树(Trie)的存储结构一般为:现将字符映射为数字,用数组反应这种映射关系。const int sizeOfCharSet = 26;class TrieNode{ int val; TrieNode* children[sizeOfCharSet];};/*// Definiti原创 2020-06-18 03:47:19 · 321 阅读 · 0 评论 -
LeetCode 144. 二叉树的前序遍历 (如何用迭代实现先序遍历)
二叉树的前序遍历class Solution {public: vector<int> ans; vector<int> preorderTraversal(TreeNode* root) { preOrder(root); return ans; } void preOrder(TreeNode* root){ if(!root){ return; }原创 2020-06-18 01:31:16 · 75 阅读 · 0 评论 -
LeetCode 1161. 最大层内元素和(二叉树的层序遍历)
最大层内元素和这里用了一个小技巧,就是map<int,int>的键是按升序的。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solutio原创 2020-06-15 16:28:34 · 138 阅读 · 0 评论 -
LeetCode 面试题54. 二叉搜索树的第k大节点 (二叉搜索树的中序遍历)
二叉搜索树的第k大节点利用了二叉搜索树的性质:前序遍历是升序的,后序遍历是降序的。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */class Solution {原创 2020-06-14 20:52:31 · 112 阅读 · 0 评论 -
LeetCode 951. 翻转等价二叉树(递归的解法)
翻转等价二叉树看到二叉树,就想到递归这个题目判断是否翻转等价二叉树,就递归地向下判断即可。递归式:两棵树的根节点值相同,左左等价且右右等价,或者左右等价且右左等价。递归终点:两根节点全为空或有一个为空、一个不为空。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(原创 2020-06-14 17:25:24 · 147 阅读 · 0 评论 -
LeetCode 1145. 二叉树着色游戏(树的遍历、树的连通块、统计节点数目)
二叉树着色游戏假如说图中的灰色的②号节点就是一号玩家选择的点,那么二号玩家尽可能有利的选择是它的左右子节点或者父节点。那么如果二号玩家想要获胜,必须占领左边,右边、其他部分的所有节点,而且这部分节点的数目要超过一半。用后序遍历求得一棵树的节点数目。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right;原创 2020-06-14 15:44:03 · 535 阅读 · 0 评论 -
LeetCode 543. 二叉树的直径 (递归、求二叉树的深度)
二叉树的直径思路①:这种写法完全是基于递归的想法:路径如果经过根节点,最长路径应该是左右子树高度之和。如果不经过,那么去看如果经过左子树的跟、经过右子树的根的最长长度。(相同问题,递归解决)不过,这种写法有很多冗余的遍历。/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * Tree原创 2020-06-13 17:08:06 · 117 阅读 · 0 评论