二叉树
程程程乘什么
这个作者很懒,什么都没留下…
展开
-
LeetCode 543:二叉树的直径
class Solution {public: int ans = 0; int diameterOfBinaryTree(TreeNode* root) { //ans = 1; dfs(root); return ans; } int dfs(TreeNode* root) { if(!ro...原创 2020-05-06 16:40:29 · 195 阅读 · 0 评论 -
剑指Offer:36 二叉搜索树与双向链表
这道题看完书上的思路之后,自己尝试写了一下,运行结果:程序使用了超过限制的内存然后自己以一颗3层的完全二叉树为例来分析运行流程,发现果然是不对的:左子树的根节点和右子树的根节点在变换后是不会和整个树的根节点相邻的,而下面的程序中却是相邻的,明显不对;class Solution {public: TreeNode* Convert(TreeNode* pRootOfTree)...原创 2019-06-16 22:19:59 · 81 阅读 · 0 评论 -
剑指Offer:33 二叉搜索树的后序遍历序列
涉及到自己之前不了解的数据结构:二叉搜索树,其实就是满足二叉树的左子树的key值<根节点的key值<右子树的key值,即为二叉搜索树。这道题本身和二叉搜索树的操作并没有关系,只是让判断一个线性序列是否满足二叉搜索树的后序遍历规律。看完书上的思路之后,还是没有办法转化为代码,又大致用十几秒浏览了下书上的程序大体结构,之后自己边写边改,还算比较顺利,第一次写完出了一处Bug:对j的...原创 2019-06-13 23:08:09 · 106 阅读 · 0 评论 -
剑指Offer:55 二叉树的深度/判断平衡二叉树
平衡二叉树,就是左子树深度和右子树深度差最多为1,沿用上一题38题的判断树的深度的代码,就可以AC但是其实代码是错误的,因为:只是判断了根节点的左右子树深度差,而平衡二叉树要求任意节点的左右子树高度差不超过1class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if(pRoot=...原创 2019-10-06 17:24:19 · 111 阅读 · 0 评论 -
剑指Offer:34 二叉树中和为某一值的路径
这道题是我感觉开始刷题以来遇到的最麻烦的题之一了(自己太菜了……)第一版代码,完全按照书上的代码写的,测试用例通过:(数组长度大的数组靠前,这一点怎么满足的?)/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left...原创 2019-06-15 23:32:49 · 86 阅读 · 0 评论 -
剑指Offer:32-1,2,3 不分层/分层/之字形 打印二叉树
这道题就是二叉树的层序遍历,是应该牢记的程序模板。借助队列的先进先出特性实现层序遍历:每pop出队首的一个节点,就会把该节点的左右子节点(如果有的话)压入队尾。C++的程序需要用到STL里的queue容器,一个参考博客:https://www.cnblogs.com/xzxl/p/7266370.html/*struct TreeNode { int val; struct T...原创 2019-06-12 10:07:25 · 97 阅读 · 0 评论 -
剑指Offer:18 二叉树的镜像
这道题思路比较简单:遍历二叉树,左右节点互换就可以了。采用递归的方式,当一个节点的某一子节点(左或右)为NULL时就结束对这一子节点的递归。缺点是时间上比较浪费:一个节点两个子节点都为NULL的情况下就不需要互换了,直接return就可以,所以可以加上这一句判断。/*struct TreeNode { int val; struct TreeNode *left; stru...原创 2019-06-08 17:03:28 · 87 阅读 · 0 评论 -
剑指Offer:17 树的子结构
对二叉树的题还不是很熟练,做的太少了。 这次看了书上的解法之后,自己再写了一遍,还是出了几个小问题,就是下面程序中注释掉的两处:1、不应该把那两行加在else下,因为根节点相同、但后续节点不同时,下面还要继续递归找下去。2、比较鸡肋的错误,注释与否关系不大,把return都放在if判断里,编译器会报错。注意:在使用指针的时候一定要注意边界条件,即检查空指针。当树A或树B为空的时候,定义...原创 2019-06-07 17:36:25 · 99 阅读 · 0 评论 -
剑指Offer:4 重建二叉树 *
这道题对于我目前的水平感觉还是有些难的,思路能想的到,但是不知道如何实现。一开始想用两重循环,外循环顺序遍历先序序列,内循环比较中序序列的位置来判断这个节点的左右儿子节点是谁。但是感觉写起来比较麻烦,写到一半卡住了。也想过用递归、或者用堆栈或队列等线性结构辅助,不过也没有具体的实现办法,最后参考了讨论区最高赞的思路,其实相当于又用C++把他的Java代码重新写了一遍。递归的思路是:找到目前...原创 2019-04-25 22:30:36 · 75 阅读 · 0 评论 -
剑指Offer 68:二叉树的最近公共祖先
68-1 二叉搜索树的最近公共祖先循环搜索: 当节点 root 为空时跳出;当 p, q都在 root 的 右子树 中,则遍历至 root.right ;否则,当 p, q 都在 root 的 左子树 中,则遍历至 root.left ;否则,说明找到了 最近公共祖先 ,跳出。返回值: 最近公共祖先 root 。 TreeNode* lowestCommonAncesto...原创 2020-05-02 21:47:42 · 115 阅读 · 0 评论 -
LeetCode :95/96 不同的二叉搜索树 (二叉搜索树组合的个数)
参考力扣上官方的题解,采用动态规划法,关键点在于:1、状态转移公式的推导;2、边界的处理:dp[0]也初始化为1,因为+=的存在,dp除0,1之外,后面的都要初始化为0class Solution {public: int numTrees(int n) { if(n <= 1) return n; vector<int>...原创 2020-02-28 21:44:57 · 203 阅读 · 0 评论 -
LeetCode:第177场周赛 1361
class Solution {public: bool validateBinaryTreeNodes(int n, vector<int>& leftChild, vector<int>& rightChild) { deque<int> q; q.push_back(0); ...原创 2020-02-23 15:47:16 · 99 阅读 · 0 评论 -
剑指Offer:52 正则表达式的匹配
1、递归的灵活运用,尤其是多种情况下如何递归返回2、字符串的基本性质:char* str 向后移动不能str++,必须str+13、各种情况考虑必须严谨,不然很容易漏掉一些可能通过的匹配模式,比如:(1)'*'前字符相同也可以跳过不匹配;(2)pattern为'.'时要匹配还需要此时str不为'\0'class Solution {public: bool match...原创 2020-02-12 12:38:56 · 109 阅读 · 0 评论 -
剑指Offer:37 二叉树的序列化
这道题是今天做的5道二叉树习题中最难的一道了,主要因为对C++/C中的几种字符串的操作不熟悉,花了很多时间理清楚语法基础:C++ 字符串与字符数组 详解/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : ...原创 2020-02-12 00:27:53 · 101 阅读 · 0 评论 -
剑指Offer :63 数据流中的中位数
很经典的一道题,书上的思路解析也非常好。面对这样的数据流问题,首先需要建立容器存储数据流:(1)数组、链表排序数组:插入时间复杂度为 O(n),查找为O(1);无序数组:插入时间复杂度 O(1),查找为O(n)排序链表:插入时间复杂度 O(n),查找为O(1)(2)二叉搜索树 BST平均情况下(左右子树比较平衡),插入为O(logn),查找中位数也是O(logn)最差的情...原创 2020-02-11 21:48:52 · 94 阅读 · 0 评论 -
LeetCode:62 二叉搜索树第K小的节点
这道题不久前在LeetCode上做过,二叉搜索树的中序遍历序列就是单调递增的。解法:递归的中序遍历,遍历到第k个节点结束递归返回;结果也作为参数列表的一部分:这是递归调用不知道如何返回结果时的一种变通的做法。注意 result 初始化为 nullptr,这样不足k个节点时,会返回nullptr。class Solution {public: TreeNode* KthNode...原创 2020-02-11 18:20:34 · 125 阅读 · 0 评论 -
剑指Offer:59 之字形打印二叉树
按照书上的解题思路,采用两个栈做辅助数据容器,逐层打印。And,清空vector的三种方法都可以使用,layer.clear() 最简洁。class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>>...原创 2020-02-11 12:27:59 · 84 阅读 · 0 评论 -
剑指Offer:60 分层输出二叉树
这道题是二叉树层序遍历的升级版,需要额外的两个变量存储当前层、下一层的节点数。出现的一个Bug:把判断当前层的节点数量的 if 判断放在了向队列添加当前节点左右儿子节点的前面:这样会造成,这一层加入结果 ret 后,下一层的节点数更新不正确,因为此时 next_layer 还没有更新!一个语法知识点:vector容器的清空要掌握:C++ vector清空元素的三种方法clas...原创 2020-02-11 11:56:13 · 144 阅读 · 0 评论 -
剑指Offer:58 判断是不是对称的二叉树
第一次自己做,思路出现了问题:对称二叉树不是一棵树的左右子节点相等,而是反转二叉树之后和原二叉树一样!class Solution {public: bool isSymmetrical(TreeNode* pRoot) { if(!pRoot) return false; bool flag = true; postorde...原创 2020-02-08 16:39:08 · 171 阅读 · 0 评论 -
剑指Offer:8 二叉树中序遍历的下一个节点
class Solution {public: TreeLinkNode* GetNext(TreeLinkNode* pNode) { if (!pNode) return nullptr; //节点有右子树,访问右子树的最左节点 if (pNode->right) { pNode = pNode-...原创 2020-02-08 13:14:05 · 90 阅读 · 0 评论 -
LeetCode 144,94,145:二叉树三种深度优先遍历
递归:class Solution {public: vector<int> preorderTraversal(TreeNode* root) { vector<int> res; if(!root) return res; preorder(root, res); return res;...原创 2020-02-07 11:31:52 · 154 阅读 · 0 评论 -
LeetCode 230:二叉搜索树中第K小的元素
最基础的解法:将整个二叉树中序遍历存入序列,取第k个(index = k-1)返回。如果是第k大就反向中序遍历。class Solution {public: int kthSmallest(TreeNode* root, int k) { if(!root) return 0; InorderTraversal(root); r...原创 2020-02-06 10:57:59 · 128 阅读 · 0 评论 -
LeetCode 250:同值子树的个数
深度优先搜索:直观上感觉是后序,但并不是严格的后序遍历Python实现:注意短路效应带来的bug,比较隐蔽class Solution: def countUnivalSubtrees(self, root: TreeNode) -> int: if root == None: return 0 self.count...原创 2020-02-03 11:26:24 · 283 阅读 · 0 评论 -
LeetCode 236:二叉树的最近公共祖先
看剑指Offer书上的解法,照葫芦画瓢写的程序,一开始运行出错,改了ans=*it1的顺序运行结果正确,但是提交后有case不通过:(代码的思路并没有完全理解)经过第一次试用LeetCode在线调试工具,打印中间变量找到问题所在:搜索路径没有把目标节点本身加入进去。class Solution {public: TreeNode* lowestCommonAncestor(Tr...原创 2019-11-26 23:04:49 · 105 阅读 · 0 评论 -
LeetCode 226:翻转二叉树
自己写的递归的解法,还是比较高效的。class Solution {public: TreeNode* invertTree(TreeNode* root) { if(root == nullptr) return nullptr; if(!root->left && !root->right) return root;...原创 2019-11-26 20:49:11 · 83 阅读 · 0 评论