标签:
我们都知道,二叉树的递归遍历可以分为三种:前序遍历、中序遍历和后序遍历,其实这三种遍历方式大同小异,由于都是使用递归实现的,因此也比较简单。
首先是tree.h文件,代码如下:
#ifndef TREE_H #define TREE_H #include <stdio.h> #include <malloc.h> #include <assert.h> typedef int ElemType; typedef struct Btree { ElemType val; struct Btree* left; struct Btree* right; }Btree, *Pbtree; #endif
然后是tree.c,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include "tree.h"
/**
* 获取某个节点的值信息
* @param Pbtree pNode 节点对应的指针信息
*
*/
static void BtreeVisit(Pbtree pNode){
if (NULL != pNode){
printf("当前节点的值为: %d\n", pNode->val);
}
}
/**
* 构造一个tree节点,置左右指针为空,并且返回指向新节点的指针
* @param ElemType 值的类型
* @return Pbtree 指向新节点的指针
*
*/
static Pbtree BtreeMakeNode(ElemType target){
Pbtree pNode = (Pbtree) malloc(sizeof(Btree));
assert( NULL != pNode );
pNode->val = target;
pNode->left = NULL;
pNode->right = NULL;
return pNode;
}
/**
* 插入一个节点信息
* @param ElemType 要插入的数据
* @Param Pbtree* 指向某一个节点的指针
* @return Pbtree 指向新节点的指针
*
*/
Pbtree BtreeInsert(ElemType target, Pbtree* ppTree){
Pbtree pNode;
assert( NULL != ppTree );
pNode = *ppTree;
if (NULL == pNode){
return *ppTree = BtreeMakeNode(target);
}
//相同则不允许插入
if (pNode->val == target){
return NULL;
}else if (pNode->val > target){
return BtreeInsert(target, &pNode->left);
}else{
return BtreeInsert(target, &pNode->right);
}
}
/**
* 前序遍历这个树
*
*/
void BtreePreOrder(Pbtree pNode){
if (NULL != pNode){
BtreeVisit(pNode);
BtreePreOrder(pNode->left);
BtreePreOrder(pNode->right);
}
}
int main(int argc, char *argv[]){
int i;
int num[] = {21,43,2,6,88,9};
Pbtree root = NULL;
for (i=0; i<sizeof(num)/sizeof(int); i++){
BtreeInsert(num[i], &root);
}
BtreePreOrder(root);
return 0;
}
这里我们的数据在插入的时候是进行了一定的区分的,如果这个数字比较小,则会插入到左边,如果大于该数字,则会插入到右边,我们最终插入的结构应该是这样的:
21
2 43
6 88
9
按照前序的输出顺序是:21 2 6 9 43 88
标签:
原文地址:http://www.cnblogs.com/xinxing/p/5278708.html