二叉树
巴巴多斯小魔
这个作者很懒,什么都没留下…
展开
-
leetcode 222. 完全二叉树的节点个数(复杂度logn*logn 左右子树深度相同 左边满二叉左子树节点个数是1<<lson的dep -1)
题目 class Solution { public: int getdep(TreeNode *root){ int dep=0; while(root) root=root->left,++dep; return dep; } int countNodes(TreeNode* root) { if(!root) return NULL; int dep1=getdep(root->lef原创 2020-11-18 13:48:31 · 192 阅读 · 0 评论 -
leetcode 235. 二叉搜索树的最近公共祖先(就询问一个点对 o(n),不可以倍增预处理nlogn,然后每次查询logn)
题目 class Solution { public: TreeNode *ans; int dfs(TreeNode *root,TreeNode *p,TreeNode *q){//判断root子树中是否有p或者q 返回1 否则返回0 if(!root||ans) return 0;//ans已经存在了,说明找到最近公共祖先了,不要再找远的祖先 int lson=dfs(root->left,p,q),rson=dfs(root->right原创 2020-11-18 13:11:20 · 97 阅读 · 0 评论 -
leetcode 865. 具有所有最深节点的最小子树(读懂题意!)
题目 读了好久读不懂题意,我这么高的语文水平,当然是出题人的错了。 返回能满足 以该节点为根的子树中包含所有题目给的这棵树最深的节点 这一条件的具有最大深度的节点。 class Solution { typedef pair<TreeNode*,int> pi; public: pi dfs(TreeNode *root){ if(!root) return {0,0}; pi x=dfs(root->left),y=dfs(root->r原创 2020-11-18 13:08:46 · 139 阅读 · 0 评论 -
leetcode 863. 二叉树中所有距离为 K 的结点(求距离目标节点为K的所有节点 分成两棵树 一个是K 一个是K的父节点)
题目 class Solution { public: TreeNode *fa;//目标节点target的父节点 vector<int>ans; void solve(TreeNode *x,TreeNode *y){ if(!y) return; if(y->left==x) y->left=NULL; else y->right=NULL; } int dfs(TreeNode *原创 2020-11-18 13:02:07 · 354 阅读 · 0 评论 -
leetcode 109. 有序链表转换二叉搜索树(注意看题,每个节点的左右子树都要满足二叉搜索树 算出链表长度后,递归像线段树一样创建)
题目 没什么好说的,看代码吧! class Solution { public: int getlen(ListNode *head){ int cnt; for(cnt=0;head;head=head->next) ++cnt; return cnt; } TreeNode* build(ListNode*&head,int l,int r){ if(!head||l>r) return NUL原创 2020-11-18 12:48:41 · 202 阅读 · 0 评论 -
leetcode 105. 从前序与中序遍历序列构造二叉树(dfs/栈 前序中序都是右儿子最后遍历)
题目 栈里放的是子树还没有创建完的节点。 class Solution { public: TreeNode* buildTree(vector<int>& pre,vector<int>& in) { if(!pre.size()) return NULL; stack<TreeNode *>s; TreeNode *root=new TreeNode(pre[0]),*cur=root;原创 2020-11-18 12:42:23 · 100 阅读 · 0 评论 -
leetcode 173. 二叉搜索树迭代器(用栈完成中序遍历 o(h)空间,就是栈的深度 / miorrs遍历 o(1)空间)
题目 class BSTIterator { public: stack<TreeNode* >s; BSTIterator(TreeNode* root) { cal(root); } void cal(TreeNode* root){//从root一直往左儿子,将这一路都放到栈里 while(root) s.push(root),root=root->left; } int next() {原创 2020-11-18 11:07:43 · 137 阅读 · 0 评论 -
leetcode 99. 恢复二叉搜索树(o(1)空间内完成中序遍历,时间o(2*n),对于每一个x的predessor建立一个predessor->right=x,然后将这个链接去掉)
题目 class Solution { public: void swap(TreeNode *x,TreeNode *y){ int tmpval=x->val; x->val=y->val,y->val=tmpval; } void recoverTree(TreeNode* root) { if(!root) return; //x,y是要交换的两个节点,las是root节点中序遍历的前原创 2020-11-18 10:50:02 · 149 阅读 · 0 评论 -
leetcode 662. 二叉树最大宽度(找个每层最左的值和最右的值 不要ll啊)
题目 为了不爆ll,我们 每层的值要减去该层第一个值,这样就算往下*2的过程,下面也不会受到影响,因为差值是一定的,下层 *2的差值也是一定的。 这样为什么可以不爆ll呢? 因为答案就是int,这决定了一切。 若我们其中一层是 1,k(k很大,k *2就爆int了),那么下一层假如k有左或右儿子,1肯定没有,因为这样答案就是ll了。 还有一种 k1,k2,两个都挺大 但是大小差的不算太多,(k2-k1)*2还是 int,但是k1 *2,k2 *2都会爆int。所以我们dfs的时候pos应该是ll. cla原创 2020-11-15 19:45:41 · 96 阅读 · 0 评论 -
leetcode 958. 二叉树的完全性检验(输出是否是完全二叉树 dfs/bfs每次假如队列的时候判断 值是不是sz)
题目 class Solution { #define pi pair<TreeNode*,int> public: bool isCompleteTree(TreeNode* root) { if(!root) return true; queue<pi>q;q.push(make_pair(root,1)); int sz=1; while(!q.empty()){ pi cur=q原创 2020-11-15 10:28:33 · 122 阅读 · 0 评论 -
leetcode101. 对称二叉树(输出是否是对称二叉树 bfs/dfs)
题目 class Solution { public: bool isSymmetric(TreeNode* root) { if(!root) return true; queue<TreeNode *>q; q.push(root->left),q.push(root->right); while(!q.empty()){ TreeNode* left=q.front();q.pop原创 2020-11-15 09:38:50 · 108 阅读 · 0 评论 -
leetcode 一些特别特别特别水的二叉树的题
题目 class Solution { public: int abs(int x){return x>0?x:-x;} int dfs(TreeNode *root){ if(!root) return 0; int ls=dfs(root->left),rs=dfs(root->right); if(ls==-1||rs==-1||abs(ls-rs)>1) return -1; return ma原创 2020-11-15 09:28:32 · 140 阅读 · 0 评论 -
leetcode 103. 二叉树的锯齿形层次遍历
题目 class Solution { private void dfs(TreeNode root,int dep,List<List<Integer>> ans){ if(root==null) return; if(dep>=ans.size()){ List<Integer> tmp=new LinkedList<Integer>(); tmp.add(ro原创 2020-11-15 09:20:19 · 73 阅读 · 0 评论