,,二叉树是一种非线性的结构,但是在计算机中存储时,却要按照线性来存储。二叉树也是由一个一个结点构成,只不过是,一个结点中既要存放数据,又要存放左孩子的指针和右孩子的指针。所以,我们想要实现二叉树,首先就得有一个二叉树的结构,根据刚才的分析,那么二叉树结构中的变量应该要有三个。代码如下:
struct BiTNode { ,,,int 数据; ,,,struct BiTNode * lchild; ,,,struct BiTNode * rchild; };
,,有了这么一个二叉树的结构之后,我们可以开始动态的创建结点。比如,我们要创建的这棵树有5个元素,A, B, C, D, e .那么,创建结点的代码如下:
struct BiTNode * A =, (, struct BiTNode *,), malloc (, sizeof (, struct BiTNode ),); struct BiTNode * B =, (, struct BiTNode *,), malloc (, sizeof (, struct BiTNode ),); struct BiTNode * C =, (, struct BiTNode *,), malloc (, sizeof (, struct BiTNode ),); struct BiTNode * D =, (, struct BiTNode *,), malloc (, sizeof (, struct BiTNode ),); struct BiTNode * E =, (, struct BiTNode *,), malloc (, sizeof (, struct BiTNode ),),
接下来,就是要对这些结点进行初始化,并且生成一棵树,这棵树,先序遍历结果为:
一个→B→C→D→E
中序遍历结果为:
B→一个→D→C→E
有了树的理论上的形状之后,我们要开始对这些结点进行联接。代码如下:
一个→data =, ' A '; 时间=一个→lchild B; 时间=一个→rchild C; 时间=B→data “B”; 时间=B→lchild B→rchild =,空; 时间=C→data “C”; 时间=C→lchild D; 时间=C→rchild E; 时间=D→data ' D '; 时间=D→lchild D→rchild =,空; 时间=E→data “E”; 时间=E→lchild E→rchild =,零;
二叉树创建好之后,就是要开始遍历二叉树了。二叉树的遍历有三种,前序,中序和后序。二叉树的遍历事实上是通过递归实现的。那么,先来实现,先序遍历,代码如下:
void PreOrderTraverse (, struct BiTNode * T ) { ,,,if (==,, T  NULL ) ,,,,,,,返回; ,,,,,,, ,,,if (, T !=, NULL ) ,,,printf (,“% c T→data ),,,,,,//先访问根结点 ,,,if (, T !=, NULL ) ,,,PreOrderTraverse (, T→lchild );,,//访问左子树 ,,,if (, T !=, NULL ) ,,,PreOrderTraverse (, T→rchild );,,,//访问右子树 ,,,, }
接着是中序遍历,中序遍历不过是先访问左子树,再访问根结点,最后访问右子树。代码如下:
void InOrderTraverse (, struct BiTNode * T ) { ,,,if (==,, T  NULL ) ,,,,,,,返回; ,,,,,,, ,,,if (, T !=, NULL ) ,,,,,,,InOrderTraverse (, T→lchild ); ,,,if (, T !=, NULL ) ,,,,,,,printf (,“% c T→data ); ,,,if (, T !=, NULL ) ,,,,,,,InOrderTraverse (, T→rchild ); }
最后一种,就是后序遍历,后序遍历就是先访问左子树,再访问右子树,最后访问根结点。代码如下:
void PostOrderTraverse (, struct BiTNode * T ) { ,,,if (==,, T  NULL ) ,,,,,,,返回; ,,,,,,, ,,,if (, T !=, NULL ) ,,,,,,,PostOrderTraverse (, T→lchild ); ,,,if (, T !=, NULL ) ,,,,,,,PostOrderTraverse (, T→rchild ); ,,,if (, T !=, NULL ) ,,,,,,,printf (,“% c T→data ); }