赞
踩
一、二叉树的存储优势:
二叉排序树是一种比较有用的折衷方案。
数组的搜索比较方便,可以直接用下标,但删除或者插入某些元素就比较麻烦。
链表与之相反,删除和插入元素很快,但查找很慢。
二叉排序树就既有链表的好处,也有数组的好处。
在处理大批量的动态的数据是比较有用。
二叉树的建立:
百度的二叉树图篇
1.创建二叉树的节点
struct Node
{
int num;//定义二叉树的数据域
struct Node *left;//指针域
struct Node *right;//--
};
2、创建二叉树的跟节点
struct creatroot
{
struct Node *root;//创建根节点
};
3、创建树并存入数据
void creat_tree(struct creatroot *tree, int value) { struct Node *node = (struct Node *)malloc(sizeof(struct Node));//动态申请二叉树节点内存空间,地址赋值给node node->num = value;// node->left = NULL;//初始化左儿子和又儿子赋值为空 node->right = NULL; if (tree->root == NULL) //判断该二叉树是否为空 { tree->root = node; //若为空则把新创建的节点存到根 } else 若不为空则执行插入操作 { struct Node *p = tree->root; while (p != NULL) { if (value < p->num)//比较节点的值,决定存入左儿子还是又儿子。 { if (p->left == NULL) { p->left = node;//如果左儿子为空,则存入左儿子 return; } else { p=p->left;//如果不为空则反会上一级从新执行 } } else { if(p->right==NULL) { p->right=node; return; } else { p=p->right; } } } } return; }
总的来说就是不停的比较二叉树节点的值和存入的值,找到空节点然后存进去。
4、二叉树的遍历
二叉树有前、中、后三种遍历方式。
A:前序遍历:
二叉树的没一个节点时,都保证先访问根结点,再访问左节点然后是右节点。
如图所示先序遍历便是先访问A其次是B然后是C。访问顺序为ABC。
B:中序遍历:
同上,保证每一次访问,都是先访问左子树,然后父节点,最后右子树。
C:后序遍历:
同上,保证每一次访问,都是先访问左子树,然后右子树,最后父节点。
一个简单的中序遍历
void look_all(struct Node *node) //遍历
{
if(node!=NULL)
{
look_all(node->left);//如果不为空则递归调用本函数,并打印节点信息
printf("%3d",node->num);
look_all(node->right);
}
}
5、主函数部分
void main(void) { struct creatroot tree;//创建树 tree.root=NULL;//初始化 int i,j; printf("请输入元素个数:"); scanf("%d",&i); clear(); for(j=1;j<=i;j++) { int p; printf("请输入%d元素:",j); scanf("%d",&p); clear(); creat_tree(&tree,p); } look_all(tree.root); system("pause"); return; }
就是对以上功能的调用
三、完整代码
#include "stdlib.h" #include "stdio.h" void clear() { int ch; while ((ch = getchar()) != EOF && ch != '\n'); } struct Node { int num; struct Node *left; struct Node *right; }; struct creatroot { struct Node *root; }; void creat_tree(struct creatroot *tree, int value) { struct Node *node = (struct Node *)malloc(sizeof(struct Node)); node->num = value; node->left = NULL; node->right = NULL; if (tree->root == NULL) { tree->root = node; } else { struct Node *p = tree->root; while (p != NULL) { if (value < p->num) { if (p->left == NULL) { p->left = node; return; } else { p=p->left; } } else { if(p->right==NULL) { p->right=node; return; } else { p=p->right; } } } } return; } void look_all(struct Node *node) { if(node!=NULL) { look_all(node->left); printf("%3d",node->num); look_all(node->right); } } void main(void) { struct creatroot tree; tree.root=NULL; int i,j; printf("请输入元素个数:"); scanf("%d",&i); clear(); for(j=1;j<=i;j++) { int p; printf("请输入%d元素:",j); scanf("%d",&p); clear(); creat_tree(&tree,p); } look_all(tree.root); system("pause"); return; }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。