二叉树
xiao-ren-wu
这个作者很懒,什么都没留下…
展开
-
将二叉树调整成大根堆,之后排序
#include<stdio.h>#include<stdlib.h>//调整成大根堆函数void Make_A_Heap(int a[], int n){ int t, end, pa, tag; //初始化数据域 end = n; tag = 1; while (tag) { pa = end / 2; ta原创 2017-06-30 09:38:03 · 1502 阅读 · 0 评论 -
二叉树中和为某一值的路径
题目: 输入一棵二叉树和一个整数,打印出二叉树和中节点值和为输入整数的所有路径,从树的根节点开始往下一直到叶子节点所经过的节点形成的一条路径。 输入的二叉树如图,输入的整数为22。 则打印两条路径: 10、12 10、5、7 思路:用前序遍历的方式访问某一个节点时,把该节点添加到路径上,并累加该节点的值,如果该节点为叶子节点并且累加的值正好为目标值,则输出该路径,如果原创 2017-11-29 10:38:09 · 233 阅读 · 0 评论 -
数的子结构
需求: 输入两颗二叉树A和B,判断B树是不是A树的子结构。如果是返回1,不是返回0。 思路 解决这个问题可以大致分为两步: 第一步:在树A中找到和树B的根节点的值一样的节点R, 第二步:判断树A中以R为根节点的子树是不是包含和树B一样的子结构。 因为在计算机中,如果两个浮点树判断大小会出现误差。不能直接写x==y 所以如果两个数的差值如果很小,那么我们就认为这两个数字是相等的。原创 2017-11-05 21:16:49 · 285 阅读 · 0 评论 -
蛇形打印二叉树
需求 请实现一个函数实现蛇形打印二叉树,即第一行从左到右的顺序打印,第二行从右到左顺序打印,第三行从左到右……. eg: 上图二叉树打印结果为: 8 10 6 5 7 9 11 思路: 按照蛇形打印二叉树需要两个栈,在打印某一层节点时,把下一层节点存储在另一个栈中,如果打印的是奇数层,则先保存左子节点,在保存右子节点,如果是偶数层,则先保存右原创 2017-11-04 23:14:20 · 2703 阅读 · 0 评论 -
从上到下打印二叉树
二叉树如图: 需求1 不分行从上到下打印二叉树 该事例打印结果为:8,6,10,6,7,9,11 思路: 每次打印一个节点的时候,如果该节点有子节点,那么就将子节点则吧该节点的子节点放到队列的末尾,接着到队尾的头部取出最早入队列的节点,重复前面的打印操作,直到队列中所有的元素都打印完毕。 如图: 队列的数据结构选择: 因为我们不知道二叉树最多一层的节点的节点个数,所以在这里用原创 2017-11-03 23:45:28 · 509 阅读 · 0 评论 -
判断一个序列是否是一棵二叉树的后序遍历序列(分治算法)
需求: 输入一个整数数组,判断该数组是不是某个二叉树的后序遍历的结果,如果是,返回1,否则返回0。 线索: 在后序遍历序列中,最后一个数字是当前二叉树的根节点,所以序列中的数字可以分为三部分,根,左子树,右子树,左子树的值都小于根节点,右子树的值都大于根节点,所以可以根据这个信息找到序列中左子树的长度,之后判断当前二叉树的右子树是否满足条件。如果满足条件,则开始分治,进一步判断左子树和右子树的原创 2017-11-02 22:17:36 · 740 阅读 · 0 评论 -
二叉树转换为双向链表
需求 输入一棵二叉搜索树,将该二叉树转换成一个排序的双向链表, (要求:不能创建任何新的节点只能调整树中指针的指向) 例如: 转换成双向链表后: 线索 在二叉搜索树中,左子树的值总是比根节点,右子树的值总是大于根节点,因此我们在将二叉搜索树变换成双向链表时,原先指向左子节点的指针调整为链表中指向前一个节点的指针,原先指向右子节点的指针调整为指向后一个节点的指针。 为了记录已经调原创 2017-11-02 13:14:37 · 1712 阅读 · 0 评论 -
二叉树的下一个节点
题目 给定一棵二叉树中的一个节点,如何找出中序遍历列的下一个节点?(树中除了有左右节点的指针还有一个指向父节点的指针) 上图的二叉树中序遍历序列为; [d,b,h,e,i,a,f,c,g] 观察二叉树的结构可知; 如果给定的节点有右子树,那么他的下一个节点是他的右子树的最左子节点 如果给定的节点没有右子树,如果他的节点是他父节点的左节点,那么他的下一个节点就是他的父节点 如果该给定的节原创 2017-10-21 14:27:04 · 167 阅读 · 0 评论 -
二叉树对称问题
1.镜像二叉树: 如图: 需求:编写一个函数,传入一棵二叉树,将该二叉树变成他的镜像。 交换过程: 总结上面的过程:先前序遍历二叉树,如果是叶子节点,则两个兄弟节点就进行交换 。 实现:void mirrorRecurisively(BTNode *root){ if (!root){ return; } else{ BTNo原创 2017-10-09 20:50:31 · 564 阅读 · 1 评论 -
重建二叉树
需求:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树。 假设:该二叉树没有重复数字。 遍历二叉树的规律 在二叉树的前序遍历序列中,第一个数字总是树的根节点的值。 在中序遍历序列中,根节点的值在序列中间,左子树的节点的值位于根节点值的左边,而右子树的节点的值位于根节点的右边。 eg: 该二叉树如图: 根据前序遍历找到根节点,之后根据中序遍历确定该根节点的左子树原创 2017-09-30 23:33:35 · 207 阅读 · 0 评论 -
创建二叉搜索树
算法描述: 利用两根指针,*pa和*son, pa指向son的前一个节点,作为son的双亲节点 每次循环son从根节点开始, 如果son的数据域比新建节点数据域大则son=son->left 反之,son=son->right, 直到son指向空为止, 此时pa指针指向的节点就是新节点的双亲节点 判断pa的数据域和p的数原创 2017-07-02 16:57:49 · 1080 阅读 · 0 评论 -
Huffman编码(二)链表实现
链表实现哈夫曼编码相比数组比较简单。//创建哈夫曼节点typedef struct node{ char word; int weight; struct node *left, *right;}HuffmanNode;//创建哈夫曼树HuffmanNode* creatHuffmanTree(char word[], int weight[]){ int l原创 2017-09-19 00:34:08 · 790 阅读 · 0 评论 -
寻找二叉树的第k大节点
需求: 给定一棵二叉树,求出第k大的节点。 根据二叉树的中序遍历中序遍历即可找到第k大的节点。 实现: 节点定义:typedef struct node{ int data; struct node *left; struct node *right;}BTNode;BTNode* searchTagCore(BTNode *root, int* k){原创 2017-11-06 13:39:57 · 2497 阅读 · 0 评论