数据结构之二叉树--C语言
二叉树是一种依托指针建立的数据结构。二叉树结构体中包含数据域和两个指针,一个指向左树,一个指向右树。开始的第一个结点称为二叉树的根节点,需要创建一个指向根节点的指针,这样才能访问整棵二叉树。
我所知的有两种建立方式。第一种是设个函数的返回类型为二叉树结点结构体。例如:
typedef struct TreeNode{
}TreeNode,*PTreeNode;
PTreeNode create(PTreeNode node){
.........
}
主函数中写入:main (){
PTreeNode root;
root=create(root);
第二种方法是在create函数中传入(PTreeNode )&node。直接修改地址中的值
void create((PTreeNode)&node){
}
这样处理之后,就能够对二叉树进行操作了。
代码::
typedef struct BTreeNode{
int data;
struct BTreeNode *left;//左树
struct BTreeNode *right;//右树
}BTreeNode,*PBTreeNode;
二叉树的建立:
void createTree(PBTreeNode &node){//建立树
int c;
scanf("%d",&c);
if(c==0)
{
node=NULL;
//printf("当前所处第%d结点处\n");
}
else
{
node=(BTreeNode *)malloc(sizeof(BTreeNode));
node->data=c;
createTree(node->left);
createTree(node->right);
}
}
二叉树的先序遍历:
void ergodic_first(PBTreeNode node){//遍历结点
if(node!=0)
{
printf("结点数据=%d\n",node->data);
ergodic_first(node->left);
//printf("右树结点数据=%d\n",node->data);
ergodic_first(node->right);
}
}
二叉树的中序遍历:
void ergodic_middle(PBTreeNode node){
if(node!=0){
ergodic_middle(node->left);
printf("结点数据=%d\n",node->data);
ergodic_middle(node->right);
}
}
二叉树的后序遍历:
void ergodic_behind(PBTreeNode node){
if(node!=0){
ergodic_behind(node->left);
ergodic_behind(node->right);
printf("结点数据=%d\n",node->data);
}
}
求二叉树的深度:
int TreeDeepth(PBTreeNode node){
if(node==0)
return 0;
int nleft=TreeDeepth(node->left);
printf("迭代第%d次\n",nleft);
int nright=TreeDeepth(node->right);
printf("迭代第%d次\n",nright);
return nleft>nright?nleft+1:nright+1;
}
主函数:
int main(){
BTreeNode *root;
//init(&node);
//建树
createTree(root);
printf("二叉树建立完成\n");
printf("先序遍历\n");
ergodic_first(root);
printf("中序遍历\n");
ergodic_middle(root);
printf("后序遍历\n");
ergodic_behind(root);
printf("遍历完成\n");
deep=TreeDeepth(root);
printf("树的深度为:%d\n",deep);
return 0;
}
可以发现二叉树的创建、遍历、求深度都使用到了递归。这是由二叉树的结构决定的。
对比链表,可以发现链表也使用了指针访问下一个结点。可见链表也可以采用递归的算法完成创建、遍历、求长、删除等功能。如,建立一个单链表。
typedef struct LinkNode{
}LinkNode;
void createLink(LinkNode *node){
int d;scanf("%d",&d);
if(d!=0)
{
node=(LinkNode *)malloc(sizeof(LinkNode));
node->data=d;
createLink(node->next);
}
else
node=NULL;
}
但是,这种方式明显占用很多的内存。