二叉树常见问题
MC丶吼吼
跪求offer养家糊口。。
展开
-
二叉树应用_重建二叉树
题目描述:输入某二叉树的前序遍历和中序遍历的结果,请重建出该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。例如输入前序遍历序列{1,2,4,7,3,5,6,8}和中序遍历序列{4,7,2,1,5,3,8,6},则重建二叉树并返回。 分析:二叉树的前序遍历为:根、左、右。所以对应的第一个节点就为根节点。确定根节点之后,扫描中序遍历序列,找到对应的根节点,即可根据中序遍历的特点(左、...原创 2018-06-13 12:58:46 · 133 阅读 · 0 评论 -
二叉树应用_序列化二叉树
题目:实现两个函数,实现序列化和反序列化二叉树。 分析:我们可以从前序遍历和中序遍历序列构造出一个二叉树。我们可以先把一颗二叉树序列化成一个前序遍历序列和一个中序遍历序列,然后进行构造。但是这个思路有两个缺点,一个是要求两个序列中所有数据都读出后才能开始反序列化,另外要求不能有数值重复的节点。 我们可以根据前序遍历的顺序来序列化二叉树,前序遍历是从根节点开始的。当在遍历二叉树碰到NULL指针时...原创 2018-06-15 10:59:05 · 118 阅读 · 0 评论 -
二叉树应用_二叉树的下一个节点
题目:给定一个二叉树和其中的一个节点,找出中序遍历的下一个节点。树中的节点除了有指向左右节点的两个指针之外,还有一个指向父节点的指针。 分析:对于这个问题分情况讨论,1、如果一个节点有右子树,那么它中序遍历的下一个节点就是它的右子树的最左子节点。2、如果一个节点没有右子树,并且是他父节点的左子节点,那么他的父节点就是中序遍历中的下一个节点。3、如果一个节点既没有右子树,并且他还是父节点的右子节点...原创 2018-06-14 16:23:26 · 259 阅读 · 0 评论 -
二叉树应用_树中两个节点的最低公共祖先
题目:给定树中的两个节点,找出这两个节点的最低公共祖先。情况1:当给定的树为二叉搜索树时。 分析:由于二叉搜索树是排序过的,位于左子树的节点都小于根节点,位于右子树的节点都大于根节点。如果要查找的两个节点比根节点大的话,则最低公共祖先在右子树中;如果要查找的两个节点比根节点小的话,则最低公共祖先在左子树中。/*struct TreeNode { int val; s...原创 2018-06-14 15:53:41 · 400 阅读 · 0 评论 -
二叉树应用_二叉树深度
题目:输入一颗二叉树的根节点,求该树的深度。 分析:方法一:在二叉树中和为某一值的路径中已经知道了如何存取树的一条路径,这里我们可以用此方法求出树的最长路径,也就是树的深度。方法二:树的深度即是左、右子树中深度较大的值加1,可以采用此方法进行递归。 方法一实现如下:/*struct TreeNode { int val; struct TreeNode *left; ...原创 2018-06-14 11:28:59 · 162 阅读 · 0 评论 -
二叉树应用_二叉搜索树与双向链表
题目:输入一颗二叉搜索树,将该二叉搜索树转换成一个排序的双向链表。要求不能创建任何新的节点,只能调整树中节点的指向。 分析:由于要求转换之后的链表是排好序的,我们采用中序遍历,遍历树中的每一个节点。根节点、左子树和右子树。在把左、右子树都转换成双向链表之后再和根节点连接起来,整颗二叉树就转换成了排序好的双向链表。 实现如下:/*struct TreeNode { int va...原创 2018-06-13 17:16:01 · 101 阅读 · 0 评论 -
二叉树应用_二叉树中和为某一值的路径
题目:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。从树的根节点往下一直到叶节点所经过的结点形成一条路径。 分析:在二叉树的前序、中序、后序三种遍历方式中只有前序遍历先访问的是根节点。因此采用前序遍历的方式遍历树,当遍历到某一个节点时,我们把该结点添加到路径上,并且累加结点的值。并且,如果该结点为叶节点且累加的和刚好为输入的整数,则当前路劲符合要求,我们把它打印出来。如...原创 2018-06-13 16:42:44 · 135 阅读 · 0 评论 -
二叉树应用_二叉搜索树的后续遍历序列
题目:输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历序列的结果。假设输入的数组的任意两个数字都互不相同。 分析:在二叉搜索树的后序遍历中,根节点在最后面。前面的序列可以分为两个部分:一个为左子树,小于根节点的值;一个为右子树,大于根节点的值。左子树序列和右子树序列同样应该为后序遍历序列,则可以通过递归判断是否满足。 具体实现:bool VerifySquenceOfBST(v...原创 2018-06-13 16:03:45 · 114 阅读 · 0 评论 -
二叉树应用_打印二叉树
题目:从上往下打印二叉树的每个节点,同一层的节点按照从左往右的顺序打印。 分析:每次打印一个节点的时候,如果该节点有子节点,就把该节点的子节点放到一个队列的末尾。每次打印队列头部的节点。直到队列中的所有节点都被打印出来为止。 实现如下:/*struct TreeNode { int val; struct TreeNode *left; struct Tree...原创 2018-06-13 15:24:41 · 238 阅读 · 0 评论 -
二叉树应用_二叉树镜像(对称)
题目:完成一个函数,输入一个二叉树,该函数输出它的镜像。 如: 分析:对于一个二叉树的镜像过程,我们可以先前序遍历这棵树的每一个节点,如果遍历到的节点有子节点,就交换它的两个子节点。当交换完所有的飞叶子节点之后,就得到了树的镜像。 具体实现:/*struct TreeNode { int val; struct TreeNode *left; struc...原创 2018-06-13 13:48:23 · 376 阅读 · 0 评论 -
二叉树应用_树的子结构
题目: 输入两棵二叉树A和B,判断B是不是A的子结构(空树不是任一树的子结构)。分析:要想查找树A中是否存在和树B一样的结构,我们可以分成两步: 1、在树A中找到和树B的根节点一样的节点R 2、在判断树A中以R为根节点的树中是不是包含和树B一样的结构。 具体实现如下:/*struct TreeNode { int val; struct TreeNode *left...原创 2018-06-13 13:32:41 · 118 阅读 · 0 评论 -
二叉树应用_二叉搜索树的第K个节点
题目:给定一颗二叉搜索树,请找出其中的第k大的结点。例如, 5 / \ 3 7 /\ /\ 2 4 6 8 中,按结点数值大小顺序第三个结点的值为4。 分析:进行中序遍历,中序遍历序列的数值是递增排序的。 /*struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;...原创 2018-06-15 16:15:46 · 339 阅读 · 0 评论