二叉树问题
二叉树
梅杏柿
这个作者很懒,什么都没留下…
展开
-
Leetcode第222题 完全二叉树的节点个数 C++解法
只说O(log2N)的思路,常规DFS和BFS都是O(N)。我思考了下,但是代码没写完。但是细细一考虑发现复杂度还是O(N),只是除了最坏情况不用遍历而已了。我的思路是先走左子树求出深度。然后按中序遍历思路,去找最下层的结点:只要是在执行内层循环语句之后(必须进入内层循环),发现深度和原来的深度不一样,说明就走到了。最后累加即可。但是写不出来,因为缺少一个执行完循环才会执行的语句(我印象是有,但是想不起来了,只有有这个才能判断,才能执行)。刚刚想到可以用一个bool变量判断;但是还是不行class原创 2021-02-07 10:42:57 · 160 阅读 · 0 评论 -
Leetcode第752题 打开转盘锁 C++解法
不会直接学习答案。发现确实还是BFS,自己一开始没想通把这个字符串的变化理解为一个8叉树就好了;class Solution {public: unordered_set<string> hash; //此段代码可进一步简化为2行见文末 string schange(string s,int i) { if(i%2) { if(s[i/2]=='9') s[i/2]='0'; else原创 2021-02-06 17:30:55 · 115 阅读 · 0 评论 -
Leetcode第111题 二叉树的最小深度 C++解法
DFS解法,递归左右,分别求左右子树深度,然后求最小值。但是一开始没考虑单边的情况,直接返回min(left,right)。class Solution {public: int minDepth(TreeNode* root) { if(!root) return 0; int left=minDepth(root->left)+1; int right=minDepth(root->right)+1; if(le原创 2021-02-06 14:56:30 · 102 阅读 · 0 评论 -
Leetcode第236题 二叉树的最近公共祖先
先用笨蛋方法去做,用栈记录每一个结点的路径;然后对比两个栈,有栈为空,或者栈顶元素不相等时就返回上一个栈顶值;class Solution {public: void findnode(TreeNode* root,TreeNode* &p,stack<TreeNode*> &fv,bool &f) { if(root==NULL) return; findnode(root->left,p,fv原创 2021-02-05 20:16:59 · 72 阅读 · 0 评论 -
Leetcode第450 删除二叉搜索树中的节点 C++解法
删除结点的话,假设找到的结点为X;需要处理X和父节点之间的关系,我之前直接删除叶子结点就是这里错了,直接删除造成内存泄露。用递归去做的话,这个结点本身是叶子结点或单边结点,那么在递归的返回值可以解决这个问题,直接返回null或另一边地址即可。但如果是左右结点都在,有两种操作方式,(我们这里都去找该结点的后继结点Y,也就是该结点的右孩子的最左孩子)第一种,让X的左结点挂到原来Y的左结点上,同时返回X的右节点即可;第二种,用Y的值去替代X的值,同时将问题转化为删除Y。递归去做class Soluti原创 2021-02-05 18:10:31 · 99 阅读 · 0 评论 -
Leetcode第701题 二叉搜索树中的插入操作C++解法
首先是迭代求解,需要保留上一个结点class Solution {public: TreeNode* insertIntoBST(TreeNode* root, int val) { if(!root) return new TreeNode(val); TreeNode *pre=root,*pmove=root; while(pmove) { pre=pmove;原创 2021-02-05 12:42:24 · 100 阅读 · 0 评论 -
Leetcode第98题 验证二叉搜索树 C++解法
第一遍,我是只是比较结点和结点的左右值,这种情况下,如果子节点跟祖父节点之前不满足要求是不匹配的。第二遍,我想通了这是中序遍历,所以要依次保存上一个结果,但是我设定的起始变量是INT_MIN,这样第71个案例通不过,至此修改了最小值才通过。class Solution {public: long pre=LONG_MIN; bool res=1; void inorder(TreeNode* root) { if(!root) return;原创 2021-02-05 10:35:51 · 95 阅读 · 0 评论 -
Leetcode第230题 二叉搜索树中第K小的元素 C++解法
问题实际上是中序遍历,但我还是犯迷了一会class Solution {public: TreeNode* res=NULL; int i=0; void findk(TreeNode *root ,int k) { if(!root) return; findk(root->left,k); //递归方法在找到之后仍然会遍历,所以加上下面一句可以起到提前中断的效果,注意要在i++之前;原创 2021-02-05 08:56:48 · 131 阅读 · 0 评论 -
Leetcode第538&1038题 把二叉搜索树转换为累加树 C++解法
实际上还是中序遍历,只是从右边开始遍历class Solution {public: int s=0; TreeNode* convertBST(TreeNode* root) { if(!root) return NULL; convertBST(root->right); s+=root->val; root->val=s; convertBST(root->le原创 2021-02-05 08:03:58 · 64 阅读 · 0 评论 -
Leetcode第700题 二叉搜索树中的搜索 C++解法
简单题。递归和迭代两种解法class Solution {public: TreeNode* searchBST(TreeNode* root, int val) { while(root) { if(root->val==val) return root; else if(root->val<val) root=root->right;原创 2021-02-04 21:33:10 · 117 阅读 · 0 评论 -
Leetcode第652题 寻找重复的子树 C++解法
这道题有几个点,第一个就是如何比较结点,方法就是序列化输出字符串,然后是如何查找是否存在,方法hashmap;如何不重复插入,方法set。实际解决的还是有几个问题;class Solution {public: unordered_map<string,TreeNode*> hashmap; set<TreeNode*> res; string preorder(TreeNode *root) { if(root==NULL)原创 2021-02-04 21:24:41 · 333 阅读 · 0 评论 -
Leetcode第222题 完全二叉树的节点个数 C++解法
前序遍历。但是这道题是要在O(N)以下,所以这种传统方法肯定是不行的class Solution {public: int countNodes(TreeNode* root) { if(!root) return 0; return 1+countNodes(root->left)+countNodes(root->right); }};...原创 2021-02-04 18:45:36 · 60 阅读 · 0 评论 -
Leetcode第297题 二叉树的序列化与反序列化 C++ DFS解法
DFS谁用谁说好!这用DFS也太方便了,直接套前序遍历就可以了!当然字符流也功不可没,因为分割字符串也变得简单!序列化居然只需要三行代码!反序列化的时候,有个问题,我没有解决,就是当字符流ss用完之后呢?这时候会怎么样?不明白…… // Encodes a tree to a single string. string serialize(TreeNode* root) { if(!root) return "null "; return t原创 2021-02-04 17:58:40 · 106 阅读 · 0 评论 -
Leetcode第297题 二叉树的序列化与反序列化 C++ BFS解法
想了一晚上,用BFS去做,好长的代码啊class Codec {public: // Encodes a tree to a single string. string serialize(TreeNode* root) { if(root==NULL) return {}; TreeNode *pmove=root; stringstream ss;//采用字符流,使转换不太复杂 queue<Tre原创 2021-02-04 09:25:26 · 83 阅读 · 0 评论 -
Leetcode第106题 从中序与后序遍历序列构造二叉树 C++解法
有了前序和中序的经验,后序的好写很多,直接反过来,从右结点开始构建即可class Solution {public: TreeNode *build(vector<int>& postorder,int& pmove,int inl,int inr,unordered_map<int,int>& rec) { if(inr<=inl) return nullptr; TreeNode原创 2021-02-03 16:10:36 · 149 阅读 · 0 评论 -
Leetcode第105题 从前序与中序遍历序列构造二叉树
真的是蠢死了,用前序去分割,能不错吗?白忙活了一上午?class Solution {public: TreeNode *build(vector<int> &preorder,vector<int> &inorder,int prel,int prer,int inl,int inr){ if((inr<inl)||(prer<prel)) return nullptr; int rval=原创 2021-02-03 10:34:04 · 74 阅读 · 0 评论 -
Leetcode第654题 最大二叉树 C++解法
先上迭代解法,关键是要分类清楚class Solution {public: TreeNode* constructMaximumBinaryTree(vector<int>& nums) { TreeNode *root=new TreeNode(nums[0]); //首先要建立一个根节点 for(int i=1;i<nums.size();i++) { TreeNode *no原创 2021-02-02 18:37:04 · 166 阅读 · 0 评论 -
Leetcode第114题 二叉树展开为链表 C++解法
先上笨蛋解法,提价的时候,我发现一个问题,这道题的检验是检验原来的root地址,如果你后面把root地址改了,那他检验的还是原二叉树。class Solution {public: void rconnect(TreeNode *&node,TreeNode *pmove) { if(pmove==nullptr) return; node->right=new TreeNode(pmove->val);原创 2021-02-02 17:07:21 · 128 阅读 · 0 评论 -
二叉树的遍历
Leetcode第226题 翻转二叉树经过这一道题,我感觉自己才有点明白前序、中序、和后序的意思。以前对这三个的理解,一直都停留在遍历访问元素,还有执着于用迭代实现。对本质看的不清。经过这道题,感觉突然有点觉悟了所谓前序中序和后序,实际上是看执行语句和递归左右子树之间的位置//前序遍历语句preOrderTraveral(node.leftChild);preOrderTraveral(node.rightChild);inOrderTraveral(node.leftChild);//中序原创 2021-02-01 22:20:32 · 48 阅读 · 0 评论 -
Leetcode第226题 翻转二叉树C++解法
开刷二叉树,都先从递归解。提交了好几次先看第一遍正确解法。class Solution {public: void reverselr(TreeNode* &lnode,TreeNode* &rnode) { if(lnode==nullptr&&rnode==nullptr) return; if(lnode==nullptr) { lnode=rnode;原创 2021-02-01 20:29:02 · 116 阅读 · 0 评论