树 & 图
文章平均质量分 82
逆風的薔薇
这个作者很懒,什么都没留下…
展开
-
探析求树中两个节点p和q的最低公共祖先
题目树中两个节点的最低公共祖先。分析描述十分简洁的题目,其实有多种变体;我们从4种情况来讨论:情况1,在二叉搜索树中找节点p和q的最低公共祖先情况2,非二叉搜索树,只是普通的二叉树,树中每个节点包含指向父节点的指针情况3,非二叉搜索树,只是普通的二叉树,且树中每个节点不包含指向父节点的指针情况4,非二叉树,只是普通的多叉树,且树中每个原创 2016-08-11 20:22:26 · 2214 阅读 · 2 评论 -
二叉树中插入节点的递归与非递归
题目 给定一棵二叉查找树和一个新的树节点,将节点插入到树中。你需要保证该树仍然是一棵二叉查找树。样例给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 2 2 / \ / \1 4 --> 1 4 / / \ 3原创 2016-08-11 21:20:01 · 2226 阅读 · 0 评论 -
二叉树和为某一值的路径
题目题目:二叉树和为某一值的路径描述:输入一颗二叉树和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。延伸:若要求路径不一定非得从二叉树的根节点或叶节点开始或结束,求所有节点数值总和等于某个给定值的所有路径。分析找出二叉树中所有满足要求的路径,基础题要求该路径原创 2016-08-11 20:56:54 · 814 阅读 · 0 评论 -
将搜索二叉树转换成双向链表
题目对二叉树的节点来说, 有本身的值域, 有指向左孩子和右孩子的两个指针; 对双向链表的节点来说,有本身的值域, 有指向上一个节点和下一个节点的指针。 在结构上, 两种结构有相似性, 现在有一棵搜索二叉树, 请将其转换为一个有序的双向链表。分析用两种方法求解本题。方法一:由于是搜索二叉树,直接求出其中序遍历序列,构造双向链表即可。方法二:采用递归实现原创 2016-09-01 16:18:59 · 1329 阅读 · 0 评论 -
判断树T2是否为T1的子树
题目你由两颗非常大的二叉树:T1,有几百万个节点;T2有几百个节点。设计一个算法,判断T2是否为T1的子树。如果T1有一个节点n,其子树与T2一模一样,则T2为T1的子树。也就是说,从节点n处把树砍断,得到的树与T2完全相同。分析方法一:在规模较小且较简单的问题中,我们可以创建一个字符串,表示中序和前序遍历结果。若T2的前序遍历是T1前序遍历的子串,并且原创 2016-08-10 17:30:32 · 1706 阅读 · 0 评论 -
求二叉查找树指定节点后继
题目设计一个算法,找出二叉查找树中指定节点的“下一个节点”(也就是中序后继)。可以假定每个节点都含有指向父节点的链接。分析既然是二叉查找树,我们知道中序遍历结果为递增有序,那么可以直接得到中序遍历结果,在线性查找指定节点的后继。上述方法是普通解法,但是我们看到题目说每个节点有父节点指针,那么我们可以换一个思路:(1)假设该节点有右子树,那么根据中序遍历的原创 2016-08-10 16:56:10 · 2134 阅读 · 0 评论 -
判断二叉查找树的三种方法
题目实现一个函数,判断一棵二叉树是否为二叉查找树。分析我们知道一棵二叉查找树的中序遍历序列是有序的,所以只需求出中序遍历结果,再依次判断该序列是否有序即可。但是上述方法需要额外线程空间保存遍历结果,在此可以省去该空间开销,只需一个变量保存访问当前节点时上一节点的值即可。本文还提供了另一种方法,基于left代码/*题目描述请实现一个函数,检查原创 2016-08-10 16:08:24 · 4377 阅读 · 0 评论 -
LintCode(72)中序遍历和后序遍历树构造二叉树
题目 中序遍历和后序遍历树构造二叉树根据中序遍历和后序遍历树构造二叉树样例给出树的中序遍历: [1,2,3] 和后序遍历: [1,3,2]返回如下的树: 2 / \1 3分析递归解决。Python代码"""Definition of TreeNode:cla原创 2016-06-15 20:46:43 · 2380 阅读 · 0 评论 -
LintCode(85)在二叉查找树中插入节点
题目 在二叉查找树中插入节点给定一棵二叉查找树和一个新的树节点,将节点插入到树中。你需要保证该树仍然是一棵二叉查找树。样例给出如下一棵二叉查找树,在插入节点6之后这棵二叉查找树可以是这样的: 2 2 / \ / \1 4 --> 1 4 /原创 2016-06-15 21:41:27 · 2626 阅读 · 0 评论 -
二叉树遍历 递归与非递归 先序-中序-后序
序题目:分别用递归和非递归的方式实现二叉树先序、中序、后序遍历!二叉树节点结构struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int v) :val(v), left(NULL), right(NULL){}};先序遍历递归实现/*递归先序遍历*/void pr原创 2016-03-01 17:46:39 · 651 阅读 · 0 评论 -
判断二叉平衡树的三种方法
题目实现一个函数,检查二叉树是否平衡。在这个问题中,平衡树的定义如下,任意一个节点,其两颗子树的高度差不超过1。分析判断平衡二叉树是一个常见题目,一般来说,我们都是求出左右子树的高度,根据定义判断其差。下面给出三种实现方法,大家可以对比其优劣。代码/*题目描述实现一个函数,检查二叉树是否平衡,平衡的定义如下,对于树中的任意一个结点,其两颗子树的高度差不超过1。给定指向原创 2016-08-10 15:33:14 · 3236 阅读 · 0 评论 -
创建二叉平衡树
题目给定一个有序整数数组,元素各不相同且按升序排列,编写一个算法,创建一棵高度最小的二叉查找树。分析高度最小的二叉查找树,显然只能是二叉平衡树。那么如何根据升序数组建立二叉平衡树,很简单,只需找到中间节点作为根,同理递归建立左右子树即可。代码/*题目描述对于一个元素各不相同且按升序排列的有序序列,请编写一个算法,创建一棵高度最小的二叉查找树。给定原创 2016-08-10 15:45:38 · 1849 阅读 · 0 评论 -
递归与非递归求二叉树深度
题目分别用递归与非递归算法求二叉树深度。分析方法一:递归方法大家都很熟悉,如何用非递归求解呢?我们知道二叉树有层序遍历,利用层序遍历的过程,记录当前层数,那么遍历结束后也就求得二叉树的层数,即深度。方法二:层序遍历需要使用一个队列来保存树的节点。初始化讲根节点入队。接着只要队列不为空,则出队,并将出队元素的子节点入队。当需要记录树的深原创 2016-08-26 11:47:43 · 4017 阅读 · 0 评论