介绍
树是一个或多个结点的有限集合,存在一个称为根的特定结点,其余的节点被分为n个互不相干的集合,相当于电脑文件管理
双亲和孩子:A是B,C,D的双亲(父结点)
性质:
- 数的所有结点数等于所有结点的度数之和加1
- 对于度为m的树,第i层上最多有m^i-1个结点
- 对于高度为h,宽为m的树,最多有(m^h-1)(m-1)个结点
二叉树
性质
- 二叉树的第i层最多有 2^ (i-1)(i>=1)个节点
- 深度为K的二叉树最多有 2^k -1 (k>=1)个节点
- 对于任何非空的二叉树T,如果叶子结点的个数为n0,而度为2的结点数为n2,则n0=n2+1
满二叉树:深度为k且含有2^k-1给结点的二叉树,所有叶子结点都只能出现在最后一层
完全二叉树:没有左子树,不能有右子树,上层没铺满,不能有下一层
代码
在二叉树中因为要改变一级指针所以要用二级指针
#include "stdio.h" #include "stdlib.h" typedef char ElemType; typedef struct tree_node { ElemType data; //左孩子 struct tree_node* lchild; //右孩子 struct tree_node* rchild; }TreeNode; typedef TreeNode* BiTree; int idx = 0; //树的数据 char str[] ="ABDH#K###E##CFI###G#J##"; //造树,造树需要改变一级指针,所以要用二级指针 void TreeCreate(BiTree* T) { ElemType ch; ch = str[idx++]; if (ch == '#') { //这里改变一级指针 *T = NULL; return; } else { *T = (TreeNode*)malloc(sizeof(TreeNode)); (*T)->data = ch; TreeCreate(&((*T)->lchild)); TreeCreate(&((*T)->rchild)); } } //遍历二叉树,遍历不需要改变T,所有用一级指针 void PrePrder(BiTree T) { if (T == NULL) { return; } //前序遍历 //printf("%c ", T->data); PrePrder(T->lchild); //中序遍历 //printf("%c ", T->data); PrePrder(T->rchild); //后序遍历 printf("%c ", T->data); } void main(void) { BiTree T; TreeCreate(&T); PrePrder(T); }

