![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
二叉树
只会写臭虫
这个作者很懒,什么都没留下…
展开
-
LeetCode 144. 二叉树的前序遍历与中序遍历(非递归)
前序遍历: class Solution { public: vector<int> preorderTraversal(TreeNode* root) { stack<TreeNode*>s; vector<int>ans; while(!s.empty()||root!=NULL){ //栈为空且ro...原创 2019-06-22 13:45:13 · 150 阅读 · 0 评论 -
最小的k个数(堆排序实现)
先用数组前k个元素维护一个大小为k的大顶堆(每次将元素插在最后,然后自底向上调整),从第k+1个数组元素开始,当数组元素小于堆顶时,取出堆顶,然后将这个元素放在堆顶,自顶向下调整。 最后取出k个数的时候,先取出堆顶,然后将最后一个元素放在堆顶,自顶向下调整。 class Solution { public: static const int maxn=1000000; int f=...原创 2019-08-15 14:27:46 · 493 阅读 · 0 评论 -
二叉树最大叶子结点到最小叶子结点的最短距离
有一棵二叉树,树上每个点标有权值,权值各不相同,请设计一个算法算出权值最大的叶节点到权值最小的叶节点的距离。二叉树每条边的距离为1,一个节点经过多少条边到达另一个节点为这两个节点之间的距离。 给定二叉树的根节点root,请返回所求距离。 解法: 先利用getMaxandMin函数找到叶子结点中最大值和最小值对应的结点,然后利用tree函数,递归返回一个pair<int,int>,第一个...原创 2019-08-15 12:27:06 · 867 阅读 · 0 评论 -
二叉树的镜像、判断二叉树是否为对称二叉树
操作给定的二叉树,将其变换为源二叉树的镜像。 思路: 后续递归,访问的结点的时候将node的left和right结点指向交换一下即可。 class Solution { public: void Mirror(TreeNode *pRoot) { if(!pRoot) return; TreeNode *tmp=pRoo...原创 2019-08-20 14:59:30 · 318 阅读 · 0 评论 -
剑指offer:二叉搜索树和双向链表
题目: 输入一个复杂链表(每个节点中有节点值,以及两个指针,一个指向下一个节点,另一个特殊指针指向任意一个节点),返回结果为复制后复杂链表的head。(注意,输出结果中请不要返回参数中的节点引用,否则判题程序会直接返回空) 解答: 利用二叉树的中序遍历,找到第一个访问的结点(利用标志位first),用head记录头结点,p记录上一个访问的结点。cur记录当前中序遍历访问的结点。 代码: /* st...原创 2019-08-11 11:29:13 · 71 阅读 · 0 评论 -
【剑指offer】树的子结构
题目描述 输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构) class Solution { public: bool judge(TreeNode* a,TreeNode* b){ if(b==NULL) return true; if(a!=NULL&&b!=NU...原创 2019-07-31 00:15:57 · 86 阅读 · 0 评论 -
LeetCode 236. 二叉树的最近公共祖先
解法: 代码: /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; ...转载 2019-07-17 20:16:22 · 64 阅读 · 0 评论 -
LeetCode 124. 二叉树中的最大路径和、LeetCode 687. 最长同值路径
LeetCode 124. 二叉树中的最大路径和 对于任意一个节点, 如果最大和路径包含该节点, 那么只可能是两种情况: 1. 其左右子树中所构成的和路径值较大的那个加上该节点的值后向父节点回溯构成最大路径 2. 左右子树都在最大路径中, 加上该节点的值构成了最终的最大路径 每个节点返回max(自己+左子树的最长路径,自己+右子树的最长路径),注意,当左右子树最长路径<0时,应该返回自身(因...原创 2019-06-23 15:55:43 · 567 阅读 · 0 评论 -
LeetCode 235. 二叉搜索树的最近公共祖先
方法1:一开始我是这么想的,找两个结点的最近公共祖先,那么这个公共祖先及它以上的结点都是相同的路径,因为是二叉搜索树嘛。所以我两次从根节点出发搜索p,q,得到两条路径,将经过的结点存放在栈里。直到访问到栈顶元素相等时返回,这个栈顶元素就是最近的公共祖先。 代码: class Solution { public: stack<TreeNode*>s1; stack<...原创 2019-06-23 15:43:35 · 218 阅读 · 0 评论 -
LeetCode 145. 二叉树的后序遍历(非递归实现)
对于任一结点P,将其入栈,然后沿其左子树一直往下搜索,直到搜索到没有左孩子的结点,此时该结点出现在栈顶,但是此时不能将其出栈并访问, 因此其右孩子还为被访问。所以接下来按照相同的规则对其右子树进行相同的处理,当访问完其右孩子时,该结点又出现在栈顶,此时可以将其出栈并访问。这样就 保证了正确的访问顺序。可以看出,在这个过程中,每个结点都两次出现在栈顶(即访问左孩子后回到该节点和访问右孩子后回到该节...原创 2019-06-22 15:51:39 · 245 阅读 · 0 评论 -
LeetCode 106. 从中序与后序遍历序列构造二叉树(已知后序与中序输出前序)
已知后序与中序输出前序(先序): 后序:3, 4, 2, 6, 5, 1(左右根) 中序:3, 2, 4, 1, 6, 5(左根右) 分析:因为后序的最后一个总是根结点,令i在中序中找到该根结点,则i把中序分为两部分,左边是左子树,右边是右子树。因为是输出先序(根左右),所以先打印出当前根结点,然后打印左子树,再打印右子树。左子树在后序中的根结点为root - (end - i + 1),即为当前...原创 2019-06-22 14:10:31 · 450 阅读 · 0 评论 -
LeetCode 105. 从前序与中序遍历序列构造二叉树(已知前序(先序)与中序输出后序)
已知前序(先序)与中序输出后序: 前序:1, 2, 3, 4, 5, 6(根左右) 中序:3, 2, 4, 1, 6, 5(左根右) 分析:因为前序(根左右)最先出现的总是根结点,所以令root为前序中当前的根结点下标(并且同时把一棵树分为左子树和右子树)。start为当前需要打印的子树在中序中的最左边的下标,end为当前需要打印的子树在中序中最右边的下标。递归打印这棵树的后序,递归出口为star...原创 2019-06-22 14:04:46 · 231 阅读 · 0 评论 -
手写堆排序
若从小到大排序,把原有数组维护成一个大顶堆即可,注意从非叶子结点中的最后一个结点倒序遍历。 若二叉树结点下标从0开始,某个节点下标为k,则它的左右子节点的下标分别为2k+1,2k+2。 获得某个节点的父节点下标的方法为(idx+1)/2-1 若二叉树结点下标从1开始,某个节点下标为k,则它的左右子节点的下标分别为2k,2k+1,获得某个节点的父节点下标的方法为idx/2。 代码如下: #incl...原创 2019-08-16 23:34:26 · 521 阅读 · 0 评论