二叉树的创建和遍历
之前对二叉树的创建和遍历一直一知半解,最近刚好有时间,决定静下心来把这一块
彻底弄清楚搞明白,开始在网上找了一些文章,觉得都介绍的不是很清楚,最后还是
找了本书静下心来看,这篇文章就当是读书笔记了。
树相对与其它数据结构而言,如链表,术语比较多,在开始学习之前,先了解一些基
本的术语还是很有必要的,树的基本术语如下:
- 结点的度:结点拥有的子树数量
- 叶子(终端结点):度为0的结点
- 分支结点(非终端结点):度不为0的结点
- 树的度:树内各结点度的最大值
- 结点的层次:从根到该结点的层数(根结点为第1层)
- 树的深度:所有结点中最大的层数
二叉树的基本特征:
- 每个结点最多只有两棵子树
- 左子树与右子树次序不能颠倒
两个问题
Q:二叉树是不是树的特殊情况
A:不是!虽然二叉树也属于一种树结构,但它是另外单独定义的一种树,并非
一般树的特例。它的子树有顺序规定,分为左子树和右子树,不能随意颠倒。
Q:满二叉树和完全二叉树有什么区别
A:满二叉树是叶子一个也不少的树,而完全二叉树虽然前n-1层是满的,但最
底层却允许在右边缺少连续若干个结点。满二叉树是完全二叉树的一个特例。
二叉树的创建与遍历
遍历二叉树是树结构插入、删除、修改、查找和排序运算的前提,是二叉树一切
运算的基础和核心
二叉树由根(D)、左子树(L)、右子树(R)构成,根据“先左后右”的约定存
在以下三种遍历方案:
- DLR 先序遍历
- LDR 中序遍历
- LRD 后序遍历
注:“先、中、后”的意思是指访问根是先于子树还是后于子树
其实三种遍历算法的访问路径是相同的,只是访问结点的时机不同,请看下图

图中用虚线所表示的就是访问路径,从图上我们可以清楚的看到,每个非空结点
都会经过3次(结点被箭头指向的次数),标识为null的节点其实不存在的,将
他们画出来,只是为了方便理解,得出的规律如下:
- 先序遍历:每个结点都在第1次经过时被访问
- 中序遍历:每个结点都在第2次经过时被访问
- 后序遍历:每个结点都在第3次经过时被访问
下面给出三种遍历算法的递归C语言实现
1 typedef struct node { 2 char data; 3 struct node *l_child, *r_child; 4 } * btree_t;
1 void pre_order_traverse(btree_t t) 2 { 3 if (t != NULL) { 4 printf("%c, ", t->data); 5 pre_order_traverse(t->l_child); 6 pre_order_traverse(t->r_child); 7 } 8 return; 9 }
1 void in_order_traverse(btree_t t) 2 { 3 if (t != NULL) { 4 in_order_traverse(t->l_child); 5 printf("%c, ", t->data); 6 in_order_traverse(t->r_child); 7 } 8 return; 9 }
1 void post_order_traverse(btree_t t) 2 { 3 if (t != NULL) { 4 post_order_traverse(t->l_child); 5 post_order_traverse(t->r_child); 6 printf("%c, ", t->data); 7 } 8 return; 9 }
二叉树的创建是建立在遍历之上的,聪明的你肯定已经想到了,对,只要将结点
访问操作改成结点的创建就OK了!
下面给出先序创建二叉树的C语言实现
1 btree_t btree_creat(void) 2 { 3 btree_t t = NULL; 4 int value; 5 6 value = getchar(); 7 8 if (value == ' ') { 9 printf("new node is null\n"); 10 } else { 11 t = (btree_t)malloc(NODE_SIZE); 12 t->data = value; 13 printf("new node is %c\n", value); 14 printf("create left node for %c\n", value); 15 t->l_child = btree_creat(); 16 printf("create right node for %c\n", value); 17 t->r_child = btree_creat(); 18 } 19 20 return t; 21 }
以上所有代码,本人亲自编译执行过,均无问题,如果想创建上图中的树,请在
运行创建函数后依次输入1 2 4 _ _ 5 _ _ 3 6 _ _ 7 _ _ (回车),'_'表示空格
先序遍历的输出:1 2 4 5 3 6 7
中序遍历的输出:4 2 5 1 6 3 7
后序遍历的输出:4 5 2 6 7 3 1
到此,二叉树的遍历和创建介绍完了,代码主要关注算法的实现,很多细节如动态
内存分配是成功的判断等还待完善。
浙公网安备 33010602011771号