![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
树
lark_ying
清醒时工作,糊涂时读书,独处时思考,烦恼时睡觉~
展开
-
剑指offer68-树的最低公共节点 C++
剑指 Offer 68 - I. 二叉搜索树的最近公共祖先给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也可以是它自己的祖先)。”例如,给定如下二叉搜索树:测试用例① root = [6,2,8,0,4,7,9,null,null,3,5], p = 2, q = 8测试用例② root = [6,2,8,0,4,7,9,原创 2020-09-20 20:26:13 · 158 阅读 · 0 评论 -
剑指offer 37-序列化二叉树 C++
题目描述请实现两个函数,分别用来序列化和反序列化二叉树二叉树的序列化是指:把一棵二叉树按照某种遍历方式的结果以某种格式保存为字符串,从而使得内存中建立起来的二叉树可以持久保存。序列化可以基于先序、中序、后序、层序的二叉树遍历方式来进行修改,序列化的结果是一个字符串,序列化时通过 某种符号表示空节点(#),以 ! 表示一个结点值的结束(value!)。二叉树的反序列化是指:根据某种遍历顺序得到的序列化字符串结果str,重构二叉树。例如,我们可以把一个只有根节点为1的二叉树序列化为"1,",然后通过自己原创 2020-05-22 14:43:48 · 194 阅读 · 0 评论 -
剑指offer 54-二叉搜索树的第k个节点 C++
题目描述给定一棵二叉搜索树,请找出其中的第k小的结点。例如, (5,3,7,2,4,6,8) 中,按结点数值大小顺序第三小结点的值为4。思路1:对于二叉搜索树,它的中序遍历数值是递增排序的。先进行递归中序,存入数组,然后从数组中取出第k大的数。尤其注意边界条件,即k与二叉树节点数的大小!若k>总节点数,就返回nullpter。class Solution {public: TreeNode* KthNode(TreeNode* pRoot, int k) { if (原创 2020-05-21 22:18:48 · 187 阅读 · 0 评论 -
剑指offer 32-3-按之字形顺序打印二叉树 C++
题目描述请实现一个函数按照之字形打印二叉树,即第一行按照从左到右的顺序打印,第二层按照从右至左的顺序打印,第三行按照从左到右的顺序打印,其他行以此类推。思路1:之字形打印,层次遍历,用两个栈。s1为偶数行 s1输入元素应先右后左;s2为奇数行 s2输入元素应先左后右class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>>原创 2020-05-21 15:27:24 · 142 阅读 · 0 评论 -
剑指offer 32-2-把二叉树打印成多行 C++
题目描述从上到下按层打印二叉树,同一层结点从左至右输出。每一层输出一行。思路1:非递归,层次遍历BFS,使用一个队列,每一层使用一个数组存储数据,分行打印class Solution {public: vector<vector<int> > Print(TreeNode* pRoot) { vector<vector<int>> res; vector<int> arr; if (pRoot == nullptr) r原创 2020-05-20 21:55:46 · 137 阅读 · 0 评论 -
剑指offer 28-对称的二叉树 C++
题目描述请实现一个函数,用来判断一颗二叉树是不是对称的。注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的。思路1:利用剑指offer第27题二叉树的镜像。先得到二叉树的镜像,再判断是否相同class Solution {public: bool isSymmetrical(TreeNode* pRoot) { if (pRoot == nullptr) return true; TreeNode* cloneRoot = clone(pRoot); Mi原创 2020-05-20 20:31:43 · 125 阅读 · 0 评论 -
剑指offer 8-二叉树的下一个节点 C++
题目描述给定一个二叉树和其中的一个结点,请找出中序遍历顺序的下一个结点并且返回。注意,树中的结点不仅包含左右子结点,同时包含指向父结点的指针。思路: 中序遍历——左中右1、存在右子树,找到右子树的最左子节点,即为下一个节点;2、不存在右子树:1)为左子节点,则下一节点是父节点;2)为右子节点,则沿着它的父节点向上遍历,直到找到第一个父节点的左子节点为该节点的位置,就是下一个节点;3)为右子节点,且找不到满足 2)的父节点,则该节点为尾节点。class Solution {public:原创 2020-05-20 14:30:40 · 159 阅读 · 0 评论 -
剑指offer 55-2-平衡二叉树 C++
题目描述输入一棵二叉树,判断该二叉树是否是平衡二叉树。在这里,我们只需要考虑其平衡性,不需要考虑其是不是排序二叉树。知识点:平衡二叉树的左右子树深度最多相差1;前面几层满秩。 参考书中解法!思路1:遍历树的每个节点时,调用TreeNodeDepth函数得到它的左、右子树的深度。缺点:至上而下,判断上层节点时,会重复遍历下层节点class Solution {public: bool IsBalanced_Solution(TreeNode* pRoot) { if (pRoot =原创 2020-05-19 20:42:36 · 160 阅读 · 0 评论 -
剑指offer 55-二叉树的深度 C++
题目描述输入一棵二叉树,求该树的深度。从根结点到叶结点依次经过的结点(含根、叶结点)形成树的一条路径,最长路径的长度为树的深度。求树的深度,可以从层次遍历和深度遍历角度考虑!思路1:递归,注意边界条件class Solution {public: int TreeDepth(TreeNode* pRoot) { int count = 0; int max = 0; dfs(pRoot, max, count); return max; } void dfs(TreeNod原创 2020-05-19 16:55:16 · 358 阅读 · 0 评论 -
剑指offer 34-二叉树中和为某一值的路径 C++
题目描述输入一颗二叉树的根节点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。思路1:带有记忆的dfs,典型解法1、先序遍历树,把节点加入路径2、若该节点是叶子节点则比较当前路径和是否等于给定值3、弹出节点,每一轮递归返回到父节点时,当前路径也应该回退一个节点class Solution {public: vector<vector<int> > FindPath(TreeNode* roo原创 2020-05-19 15:20:38 · 157 阅读 · 0 评论 -
剑指offer 33-二叉搜索树的后序遍历序列 C++
题目描述输入一个非空整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。如果是则输出Yes,否则输出No。假设输入的数组的任意两个数字都互不相同。思路1:后序遍历,数组最后一个元素必为根节点。1、先找到根节点root,位于数组末尾;2、从左到右遍历数组,得到第一个比root大的元素位置i,将数组分为两部分,i左边为左子树,i开始往右为右子树;3、判断右子树是否满足>root4、递归1,2,3class Solution{public: bool VerifySquenceOfB原创 2020-05-18 16:46:56 · 211 阅读 · 0 评论 -
剑指offer 32-从上到下打印二叉树 C++
题目描述从上往下打印出二叉树的每个节点,同层节点从左至右打印。思路:非递归,层次遍历,即广度优先算法(bfs),使用队列1、将根节点入队;2、若队列非空,取队首元素,push到vector中;3、将下一层节点加入到队尾4、重复2、3,直到队列为空/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), righ原创 2020-05-18 14:32:22 · 95 阅读 · 0 评论 -
剑指offer 36-二叉搜索树与双向链表 C++
题目描述输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的结点,只能调整树中结点指针的指向。思路1:递归——按照中序遍历 左根右,先找到左子树的最左头节点;将根节点连接到左子树最右边节点;再找到右子树的最左节点,链接到根节点右边。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), r原创 2020-05-17 20:52:39 · 130 阅读 · 0 评论 -
剑指offer 27-二叉树的镜像 C++
题目描述操作给定的二叉树,将其变换为源二叉树的镜像。思路1:非递归,使用队列进行每一层的反转/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), right(NULL) { }};*/class Solution {public: void Mirror(TreeNode *pRoot) {原创 2020-05-17 17:25:44 · 124 阅读 · 0 评论 -
剑指offer 26-树的子结构 C++
题目描述输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)思路:递归1、递归A树,找到与B的根节点相同的节点;2、找到根节点后,再判断A、B的左右子树是否相同;3、若相同,返回true;否则,返回false。/*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; TreeNode(int x) : val(x), left(NULL), righ原创 2020-05-17 16:21:36 · 134 阅读 · 0 评论 -
剑指offer 7-重建二叉树 C++
题目描述输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。思路:递归前序遍历:根-左-右中序遍历:左-根-右1、由前序遍历序列知道第一个为根节点;2、先找到根节点在中序的位置,将中序拆分为左和右子树;3、对于中序序列的左右子树,分别找到其对应的前序序列的左右子树;4、重复1、2、3/** * Defini原创 2020-05-17 15:12:36 · 145 阅读 · 0 评论