树定义:node
通俗的讲:数据库
结点、父结点、子结点、根结点ui
深度:从根节点到最底层结点的层数称为深度,根节点第一层操作系统
叶子结点:没有子结点的结点指针
非终端节点:其实是非叶子结点code
度:子结点的个数成为度对象
通常树:任意一个结点的子结点的个数都不受限制继承
二叉树:任意一个结点的子结点个数最可能是两个,且子结点的位置不可更改递归
二叉数分类:进程
森林:n个互不相交的树的集合
连续存储(彻底二叉树)
优势:查找某个结点的父结点和子结点(也包括判断有没有子结点)速度很快
缺点:耗用内存空间过大
链式存储
双亲表示法:求父结点方便
孩子表示法:求子结点方便
双亲孩子表示法:求父结点和子结点都很方便
二叉树表示法:把一个通常树转化成一个二叉树来存储,
一个普通树转换成的二叉树必定没有右子树
森林的存储
先把森林转化为二叉树,再存储二叉树
先序遍历:根左右
先访问根结点,再先序访问左子树,再先序访问右子树
中序遍历:左根右
中序遍历左子树,再访问根结点,再中序遍历右子树
后续遍历:左右根
后续遍历左子树,后续遍历右子树,再访问根节点
给定了二叉树的任何一种遍历序列,都没法惟一肯定相应的二叉树,可是若是知道了二叉树的中序遍历序列和任意的另外一种遍历序列,就能够惟一地肯定二叉树
先序:ABCDEFGH
中序:BDCEAFHG
求后序: 这个本身画个图体会一下就能够了,很是简单,这里简单记录一下
再来一个例子,和上面的思路是同样的,这里就不详细的写了
先序:ABDGHCEFI
中序:GDHBAECIF
已知中序和后序求先序
中序:BDCEAFHG
后序:DECBHGFA
这个和上面的思路是同样的,只不过是反过来找,后序找根,中序找左右
树简单应用
树是数据库中数据组织一种重要形式
操做系统子父进程的关系自己就是一棵树
面向对象语言中类的继承关系
哈夫曼树
#include <stdio.h> #include <stdlib.h> typedef struct Node { char data; struct Node * lchild; struct Node * rchild; }BTNode; /* 二叉树创建 */ void BuildBT(BTNode ** tree) { char ch; scanf("%c" , &ch); // 输入数据 if(ch == '#') // 若是这个节点的数据是#说明这个结点为空 *tree = NULL; else { *tree = (BTNode*)malloc(sizeof(BTNode));//申请一个结点的内存 (*tree)->data = ch; // 将数据写入到结点里面 BuildBT(&(*tree)->lchild); // 递归创建左子树 BuildBT(&(*tree)->rchild); // 递归创建右子树 } } /* 二叉树销毁 */ void DestroyBT(BTNode *tree) // 传入根结点 { if(tree != NULL) { DestroyBT(tree->lchild); DestroyBT(tree->rchild); free(tree); // 释放内存空间 } } /* 二叉树的先序遍历 */ void Preorder(BTNode * node) { if(node == NULL) return; else { printf("%c ",node->data ); Preorder(node->lchild); Preorder(node->rchild); } } /* 二叉树的中序遍历 */ void Inorder(BTNode * node) { if(node == NULL) return; else { Inorder(node->lchild); printf("%c ",node->data ); Inorder(node->rchild); } } /* 二叉树的后序遍历 */ void Postorder(BTNode * node) { if(node == NULL) return; else { Postorder(node->lchild); Postorder(node->rchild); printf("%c ",node->data ); } } /* 二叉树的高度 树的高度 = max(左子树高度,右子树高度) +1 */ int getHeight(BTNode *node) { int Height = 0; if (node == NULL) return 0; else { int L_height = getHeight(node->lchild); int R_height = getHeight(node->rchild); Height = L_height >= R_height ? L_height +1 : R_height +1; } return Height; } int main(int argc, char const *argv[]) { BTNode * BTree; // 定义一个二叉树 printf("请输入一颗二叉树先序序列以#表示空结点:"); BuildBT(&BTree); printf("先序序列:"); Preorder(BTree); printf("\n中序序列:"); Inorder(BTree); printf("\n后序序列:"); Postorder(BTree); printf("\n树的高度为:%d" , getHeight(BTree)); return 0; } // ABC##DE##F##G##