
二叉树
文章平均质量分 67
mach7
nil
展开
-
递归求huffman树的叶子结点的加权路径长度wpl
由构造方式,显然,huffman树的儿子结点总是成对出现的。因此,一个父节点,要么一个儿子都没有,要么有两个儿子。下面是递归计算wpl(weighted path length)的代码:void calc_wpl(htn *root, int path_count, int *wpl) //root是整个huffman树的根结点{ if(root->leftc==N原创 2014-02-26 17:21:18 · 4827 阅读 · 3 评论 -
最大堆/最小堆、siftup和siftdown
从数据的存储结构看,最大堆/最小堆是一个数组。从数据的逻辑结构看,最大堆/最小堆是一棵完全二叉树。堆有以下三种基本操作:1.初始化:将一个无序的序列初始化成堆。从最后一个非叶子结点开始,自右向左,自下向上,对每一个根结点执行siftdown操作。O(N)。2.插入。在数组的末尾插入新的元素,然后执行siftup操作。O(logN)。3.删除。删除指定位置的元素,用数组末原创 2014-02-26 16:48:50 · 14174 阅读 · 1 评论 -
递归求二叉树的层数和递归打印二叉树的树形结构
以下是打印二叉树树形结构的要求:第二部分为表达式树的显示,如样例输出所示。如果该二叉树是一棵满二叉树,则最底部的叶子结点,分别占据横坐标的第1、3、5、7……个位置(最左边的坐标是1),然后它们的父结点的横坐标,在两个子结点的中间。如果不是满二叉树,则没有结点的地方,用空格填充(但请略去所有的行末空格)。每一行父结点与子结点中隔开一行,用斜杠(/)与反斜杠(\)来表示树的关系。/出现的横坐标位原创 2014-02-26 15:59:26 · 8523 阅读 · 3 评论 -
二叉树的深度优先dfs遍历(前序、中序和后序;递归与非递归)
二叉树本身就是用递归定义的,因此采用递归方法实现dfs的三种遍历不仅容易理解而且代码简洁。若用非递归实现,则要采用栈去模拟:保存计算的上下文,使得计算在返回上一级时有路可循。注意每一个结点都要当作根结点来看待。//前序遍历//递归实现:根左右void preOrder1(BinTree *root){ if (root != NULL) {原创 2014-02-26 15:18:14 · 8843 阅读 · 0 评论 -
由后缀表达式建立表达式树
给出后缀表达式,建立表达式树。后缀表达式中只有操作数和操作符,我们知道,操作数一定是表达式树的叶子结点,操作符一定是父结点。这个过程与计算后缀表达式的值的过程极为类似。操作数,作为叶子结点,可以看作是左右儿子都为NULL的父结点,因此也可以看作一棵二叉树。因此算法是,建立一个二叉树栈,扫描后缀表达式:1.若遇到操作数,把其作为左右儿子都为NULL的二叉树,根原创 2014-02-26 16:29:56 · 3571 阅读 · 1 评论 -
由中根序列和后根序列重建二叉树
题目给出了某棵二叉树的中根序列和后根序列,要求输出前根序列。例如,中根序列是9、5、32、67,后根序列是9、32、67、5,则二叉树是它的前根序列是5、9、67、32。我们知道,中根序列的顺序是“左根右”,后根序列的顺序是“左右根”。因此:1.后根序列的最后一个元素是根。2.由1确定根之后,这个根将中根序列分为左右两个部分:左边是左子树的中根序列,原创 2014-02-26 15:32:05 · 8515 阅读 · 4 评论 -
openjudge树的转换
照例先上题目7:树的转换查看提交统计提问总时间限制: 5000ms 内存限制: 65536kB描述我们都知道用“左儿子右兄弟”的方法可以将一棵一般的树转换为二叉树,如: 0 0 / | \ / 1 2 3原创 2014-03-06 17:21:38 · 2495 阅读 · 0 评论 -
广度优先搜索bfs与抓住那头奶牛(Catch that cow, poj3278)
广度优先搜索(Breadth First Search, BFS)是对树的逐层遍历,或者说,是对树的横向遍历。bfs是盲目的。bfs常被用来求解达到某目标所需的最少步骤数。例如poj3278,给定两个自然数n与k,每一步的移动有三种可能,n+1、n-1和n*2,问,从n出发,到达k所需要的最小移动次数。举个例子,n=5,k=17,则bfs步骤如下:原创 2014-02-26 13:03:38 · 2461 阅读 · 3 评论