二叉树、
与链表类似,“二叉树”也是用一组不连续的存储空间来存储一组同类型的元素,并用指针将这些存储空间连接起来,每个存储空间被称作树上的一个结点。不同的是,二叉树的指针表示结点之间的”父——子“关系,从而形成一种非线性的数据存储结构。他看起来像一棵倒立的树。
二叉树可以用来存储任何类型的元素,每个结点存储一个元素的值,并有两个指针:左指针和右指针。两个结点A和B,如果A有一个指针指向B,则将A称为B的“父结点”、B称作A的“子结点”。
相关概念、
*叶子结点:一个节点如果没有任何子结点,则将其称作一个叶子结点,或者简称叶子。
*根结点:一棵二叉树中有唯一的一个结点,不是其他任何节点的子结点,这个结点称作二叉树的根结点,或则简称根。根节点位于二叉树的最顶层;
*结点层数:根所在的层数为0,其他结点的层数是父结点所在的层数加1.
*二叉树的深度:叶子结点所在的最大层数称作树的深度。
*子树:假设B是A的子结点,从B出发能达到的全部结点构成一棵以B为根的树,称为A的一棵子树。如果B是A的左子结点,则该子树称为A的左子树。
二叉树的建立、
从一个文本中读入一组数据,用一棵二叉树存储这些整数。读入的第一个整数存储在根节点上。以后美读入一个整数时,向root代表的二叉树上插入一个新的结点,存储所读入的整数。最终的二叉树上,任取一个结点A:A的值不小于它左子树上的任何值、它的右子树上的每个值都大于A的值。下面的程序演示了建立这样一棵二叉树的过程。
View Code1 #include<stdio.h> 2 #include<stdlib.h> 3 4 struct TreeNode { //二叉树结点的数据类型 5 //数据域 6 int val; 7 //指针域 8 TreeNode *Left, *Right; 9 }; 10 11 TreeNode * insertTree(TreeNode * root, int val) { //想二叉树中添加新的节点 12 TreeNode * newNode; 13 if(root == NULL) { 14 newNode = new TreeNode; 15 newNode -> val = val; 16 newNode -> Left = NULL; 17 newNode -> Right = NULL; 18 return (newNode); 19 } 20 if(val <= root -> val) 21 root -> Left = insertTree(root -> Left, val); 22 else 23 root -> Right = insertTree(root -> Right, val); 24 return root; 25 } 26 27 void delTree(TreeNode * root) { //删除二叉树占用的存储空间 28 if(root -> Left != NULL) delTree(root -> Left); 29 if(root -> Right != NULL) delTree(root -> Right); 30 delete root; 31 return; 32 } 33 34 void printTree(TreeNode * root, char offset[]) { //输出二叉树的形状 35 char str[81]; 36 printf("%s%d ", offset, root -> val); 37 sprintf(str, "%s%s", offset, " "); 38 if(root -> Left != NULL) 39 printTree(root -> Left, str); 40 else 41 printf("%s$ ", str); 42 if(root -> Right != NULL) 43 printTree(root -> Right, str); 44 else 45 printf("%s$ ", str); 46 return; 47 } 48 49 int main() 50 { 51 FILE *fin; 52 TreeNode *root; 53 int val; 54 char str[81], inFile[30]; 55 printf("input the data file's name: "); 56 scanf("%s", inFile); 57 fin = fopen(inFile, "r"); 58 //从输入文件里读入数据,建立一棵二叉树 59 root = NULL; 60 while(fscanf(fin, "%d", &val) != EOF) root = insertTree(root, val); 61 fclose(fin); 62 //查看建立二叉树的形状 63 sprintf(str, "%s", ""); 64 printTree(root, str); 65 //删除所建立的二叉树 66 delTree(root); 67 return 0; 68 }可用此代码生成文本文件
View Code1 #include<stdio.h> 2 3 int main() 4 { 5 FILE *fp; 6 int n, a[100]; 7 scanf("%d", &n); 8 for(int i = 0; i < n; i++) { 9 scanf("%d", &a[i]); 10 } 11 fp = fopen("f:\wakawaka", "wb"); 12 for(int i = 0; i < n; i++) { 13 fprintf(fp, "%d ", a[i]); 14 } 15 fclose(fp); 16 return 0; 17 }