二叉树的创建和遍历

之前对二叉树的创建和遍历一直一知半解,最近刚好有时间,决定静下心来把这一块

彻底弄清楚搞明白,开始在网上找了一些文章,觉得都介绍的不是很清楚,最后还是

找了本书静下心来看,这篇文章就当是读书笔记了。

 

树相对与其它数据结构而言,如链表,术语比较多,在开始学习之前,先了解一些基

本的术语还是很有必要的,树的基本术语如下:

  • 结点的度:结点拥有的子树数量
  • 叶子(终端结点):度为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

 

到此,二叉树的遍历和创建介绍完了,代码主要关注算法的实现,很多细节如动态

内存分配是成功的判断等还待完善。

 

posted on 2013-10-01 16:16  longtzw  阅读(877)  评论(0)    收藏  举报

导航