数组插入排序

插入排序是一个相对复杂一点的排序算法,但是效率要比我们以前接触过的排序算法快一些,他的思想是将数组分为两组数据(第一次分的时候就是数组第一个元素为一组,后面的所有元素为一组),然后从后面一组数据中抽取第一个元素与前面一组数据依次做对比,按需求将大的或者小的值插入到前面的一组数据中,最终后面一组数据全部插入完毕后,...

数组选择排序

选择排序的规则是让第 i 个元素分别于后边的元素进行比较,记录最小的元素的位置,遍历完成之后,进行交换。将数组中每一个元素进行处理后最终得出有序的数据。其交换步骤图如下(摘自 传智播客 教师课件): 【实现代码】void select_sort(int* arr, int len){// ...

#号法创建树

前面我们记录下来的文章都是手动创建的树,我们还从未尝试过将一组数据动态的在内存中构建成为一棵树。本文将详细介绍使用#号创建法动态的在内存中创建树的详细步骤。当然动态创建树并非就这么一种办法,我们记录的是最常用而且是最方便的方法。 动态创建树有一种方法是根据先序和中序遍历的结果推导出树的结构中内存中创建,办法相对...

树的非递归遍历

树使用递归遍历非常方便,如果将代码拉伸开来,我们能否是否非递归代码来实现呢?当然是可以的,我们只要把递归的循环步骤修改为while就可以了。但我们需要借用到STL的栈模型来实现这个需求,具体的步骤如下: 步骤1: 如果结点有左子树,该结点入栈,并放弃其左子树; 如果结点没有左子树,访问该结点; 步骤2: 如果...

求二叉树高度

二叉树的高度就是从根节点到最深的叶子节点之间的节点数,计算方法使用递归时,判断如果到了树的叶子节点那么就返回0。依次遍历左侧和右侧节点的数量,然后求出最大值再算上当前根节点的数量+1,递归循环返回后得出最终的结果。代码如下: int depthTree(TirTNode* tree){if (NULL ...

二叉树的拷贝

二叉树拷贝也相对简单,我们只需要在遍历的过程中,将每一个有效的节点依次给传递进来的新树的节点衔接起来就可以了。大致的思路我们可以总结一下。 malloc一个新节点 拷贝左侧子树、拷贝右侧子树、链接左侧和右侧子树 如果左侧和右侧子树非叶子节点,重复1、2步骤 【实现代码】 TirTNode* copyTree...

求树中叶子节点的个数

这个题目作为一个小练习,让我们对树的概念进一步的掌握,其实思路非常简单,在遍历树的过程中,计算某个节点如果leftChile和rightChild都指向NULL,那么证明其就是一个叶子节点,我们对引用计数加一就可以了。具体代码如下: void countleaf(TirTNode* tree, int* cou...

树的三种遍历方式(先序、中序、后序)

树的遍历分很多种,经过前人总结,树的遍历其实一共就有三种方法,一种为先序遍历、一种为中序遍历、最后一种为后续遍历。他们不同的区别就是在遍历过程中查找树的根、左节点、右节点的顺序,同样由于遍历树惯用递归的方式,所以所谓的查找顺序不同就是在递归过程中打印节点数据时的代码位置不同而已,如果这句话你看的比较绕,那么在后面...

二叉树双亲表示法

前面我们介绍过二叉树的单向表示和双向表示发,分别是借用了几个指针来实现。双亲表示法则是用了一个非常详细的结构体描述了一个节点,然后将节点串联到另外一个结构体中(这个结构体包含一个数组),具体的代码如下: #define _CRT_SECURE_NO_WARNINGS#include <stdio.h>...

单向二叉树及双向二叉树表示

我们使用二叉树总该需要有一个连接他们的方法,比如根节点有两个子节点,我们一个在根节点左侧,一个在根节点右侧,我们到底该如何表示他们,其实非常简单,我们只需给根节点这个节点中增加两个属性,一个指向左侧子节点的指针,一个是指向右侧节点的指针即可。如下图表示: 【实现代码】 #include <stdio.h...