二叉树
文章平均质量分 76
石锅拌饭
新的博客在简书更新,欢迎阅读指正。
展开
-
保存二叉搜索树到文件中
问题:设计一个算法,将一棵二叉搜索树(Binary Search Tree,BST)保存到文件中,需要能够从文件中恢复原来的二叉搜索树。注意算法的时空复杂度。思路:二叉树遍历算法有先序遍历、中序遍历、后序遍历算法等。但是它们中间只有一种遍历算法符合题目条件,用于保存BST到文件中并从文件中恢复原来的BST。假定我们要保存的BST如下: _ 30_ /原创 2012-07-23 11:28:10 · 7891 阅读 · 1 评论 -
判定两棵二叉树是否同构
题目描述给定两棵二叉树,根结点为t1和t2,判定这两棵二叉树是否同构。所谓二叉树同构就是指它们的结构相同。 分析为了判定是否同构,可以考虑递归来解决。代码比较简单,如下所示bool isomorphism(Node* t1, Node* t2){ if(NULL == t1 || NULL == t2) return (NULL == t1) &&原创 2012-10-13 21:03:15 · 5353 阅读 · 1 评论 -
二叉树两结点的最低公共祖先结点(一)
题目二叉树结点的定义如下:struct node { int data; struct node* left; struct node* right;};给定二叉树中的两个结点,输出这两个结点的最低公共祖先结点(LCA)。注意,该二叉树不一定是二叉搜索树。比如给定的二叉树如下所示,则可以知道结点1和5的最低公共祖先结点为5,结点4和5的最低公共祖先原创 2012-09-02 23:01:42 · 11504 阅读 · 4 评论 -
找出二叉树中最大的子树,且子树为二叉搜索树
题目找出二叉树中最大的子树,该子树为二叉搜索树。所谓最大的子树就是指结点数目最多的子树。分析该题目是要找出二叉树中最大的子树,该子树必须是二叉搜索树(BST)。子树的概念需要重点关注一下,以下面一棵二叉树为例 ____10____ / \ __5_ 15_ / \原创 2012-10-05 22:16:09 · 4054 阅读 · 0 评论 -
完全二叉树的判定
问题描述判定一棵二叉树是否是完全二叉树。二叉树定义如下:struct node { int data; struct node* left; struct node* right; }; typedef struct node BinaryTree;完全二叉树的定义:若设二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的原创 2012-10-05 23:08:41 · 2353 阅读 · 0 评论 -
二叉树中节点的最大距离
《编程之美: 求二叉树中节点的最大距离》的另一个解法原文地址:http://www.cnblogs.com/miloyip/archive/2010/02/25/1673114.html昨天花了一个晚上为《编程之美》,在豆瓣写了一篇书评《迟来的书评和感想──给喜爱编程的朋友》。书评就不转载到这里了,取而代之,在这里介绍书里其中一条问题的另一个解法。这个解法比较简短易读及降低了空间复转载 2012-10-05 20:03:37 · 2077 阅读 · 0 评论 -
二叉树问题汇总(2)—常见问题
在上一篇二叉树问题汇总(1)中总结了下二叉树的一些基本问题,主要是针对二叉排序树。这篇文章主要汇总二叉树的一些常见的但是难度稍大一点的问题。1、判定二叉树是否存在和为给定值的路径问题:给定一个值,判定二叉树是否存在从根结点到叶结点的路径,其结点的数据之和为该值。比如二叉树如下所示,给定的和为27:则二叉树存在的根结点到叶结点的路径有:path 1: 5 4 11 7原创 2012-07-19 21:43:49 · 2165 阅读 · 0 评论 -
二叉树问题汇总(1)—基础问题
1、创建二叉搜索树二叉搜索树是排序的二叉树,即左子树的值都不大于根结点,右子树的值都比根结点大。插入结点到一颗二叉搜索树可以使用递归或者非递归方法。使用递归方法代码简单,使用非递归则易于理解。二叉搜索树BST定义:struct node { int data; struct node* left; struct node* right;};二叉搜索树创建结点原创 2012-07-19 21:09:44 · 2267 阅读 · 0 评论 -
判定一棵二叉树是否是二叉搜索树
问题给定一棵二叉树,判定该二叉树是否是二叉搜索树(Binary Search Tree)?解法1:暴力搜索首先说明一下二叉树和二叉搜索树的区别。二叉树指这样的树结构,它的每个结点的孩子数目最多为2个;二叉搜索树是一种二叉树,但是它有附加的一些约束条件,这些约束条件必须对每个结点都成立:结点node的左子树所有结点的值都小于node的值。结点node的右子树所有结点的原创 2012-07-21 20:18:05 · 22730 阅读 · 5 评论 -
序列化/反序列化二叉树
题目设计一个算法能够实现序列化和反序列化一棵二叉树(注意,不是二叉搜索树BST)。这里的序列化指的是将一棵二叉树保存到文件中,反序列化就是从文件中读取二叉树结点值重构原来的二叉树。思路前一篇文章保存二叉搜索树到文件中 解决了保存一棵二叉搜索树到文件中的问题,但是由于本题目的意思是要把一棵二叉树保存到文件中并从文件中读出重构二叉树。因为二叉树不一定是二叉搜索树,所以前面文章中的原创 2012-07-24 08:48:47 · 16882 阅读 · 0 评论 -
将有序单链表转换为平衡的二叉搜索树
题目:给定一个升序排列的有序单链表,将其转换为一棵平衡的二叉搜索树。分析:单链表的结点结构如下。struct node { int data; struct node *next;};由于单链表升序排列,可以参照前面的文章将有序数组转换为平衡二叉搜索树, 先求的链表中的结点的值保存在数组中,然后采用相同的方法实现,时间复杂度为O(N)。当然也可以不额原创 2012-08-15 08:51:48 · 3286 阅读 · 0 评论 -
二叉树遍历之递归算法
二叉树的遍历算法有多种,典型的有先序遍历、中序遍历、后序遍历以及层序遍历。而且这些遍历的递归算法较为简单,代码很少,容易实现,本文就是汇总二叉树遍历的递归算法,非递归算法将在下一篇文章中进行总结。本文中用到的二叉树实例如下: 3 / \ 9 20 / \ 15 7二叉树定义和辅助函数如下:struct node {原创 2012-07-22 19:31:35 · 13312 阅读 · 3 评论 -
二叉树遍历之非递归算法
在前一篇文章二叉树遍历递归算法对二叉树遍历的递归算法做了总结,这篇文章就来对二叉树遍历的非递归算法做个汇总。还是与上一篇文章一样的顺序,一一汇总先序、中序、后序以及层序遍历的非递归算法。1、先序遍历(非递归算法)先序遍历非递归访问,使用栈即可实现。先序遍历的非递归访问在所有的遍历中算是最简单的了。主要思想就是先将根结点压入栈,然后根结点出栈并访问根结点,而后依次将根结点的右孩子、左原创 2012-07-22 22:30:26 · 33640 阅读 · 21 评论 -
二叉搜索树转换成有序的双向循环链表(一)
题目描述给定一棵二叉排序树(BST),将该树转换成一棵双向循环链表。请看下面的图示说明,你可以更清楚的了解题意。BST的结构定义如下:struct node { int data; struct node* left; struct node* right;};typedef struct node Node;原创 2012-09-03 22:46:53 · 3521 阅读 · 0 评论 -
二叉树两结点最低公共祖先结点(二)
问题在前面的文章二叉树两结点最低公共祖先结点(一) 中有探讨过这个问题,不过本文考虑的是另外一种二叉树,该二叉树每个结点包含一个指向父结点的指针,根结点的父结点为NULL。其结构如下: struct node { int data; struct node* left; struct node* right;原创 2012-09-03 17:37:22 · 2528 阅读 · 2 评论 -
二叉搜索树两结点最低公共祖先结点
题目给定一棵二叉搜索树(BST),找出树中两个结点的最低公共祖先结点(LCA)。二叉搜索树结点定义: struct node { int data; struct node* left; struct node* right; }; 如下图为一棵BST,结点2和8的LCA是6,结点4和2的LCA是2原创 2012-09-03 16:29:42 · 2653 阅读 · 2 评论 -
将有序数组转换为平衡二叉搜索树
问题给定一个有序数组,数组元素升序排列,试将该数组转换为一棵平衡二叉搜索树(Balanced Binary Search Tree)。 思路这个问题用递归很容易解出来。考虑下面一棵二叉搜索树:这是一棵平衡的二叉搜索树,所谓平衡的定义,就是指二叉树的子树高度之差不能超过1。如果要从一个有序数组中选择一个元素作为根结点,应该选择哪个元素呢?我们应该选择有序数组的中间元素作为原创 2012-07-26 08:27:04 · 10371 阅读 · 0 评论 -
中序遍历和先序遍历/后序遍历构建二叉树
1、问题给定二叉树的2个遍历序列(如先序+中序,先序+后序,中序+后序等),是否能够根据这2个遍历序列唯一确定二叉树?2、理论分析数据结构的基础知识中重要的一点就是能否根据两种不同遍历序列的组合(有三种:先序+中序,先序+后序,中序+后序),唯一的确定一棵二叉树。然后就是根据二叉树的不同遍历序列(先序、中序、后序),重构二叉树。显然,这三种组合并不是都能唯一确定二叉树的,其原创 2012-07-25 15:02:23 · 29477 阅读 · 13 评论