1、定义:树是一种非线性结构,是一种一对多的数据结构。
分析树的结构,我们用递归的方法,根结点下面又可以看做是子树。
2、树的存储结构:
我们一般用孩子兄弟法存储。也就是把一个结点的左边第一个孩子放在此结点的左边孩子,把此结点的右兄弟放在此结点的右边孩子。
这样就产生了二叉树。
二叉树和树可以相互对应。
3、二叉树及其性质
总之二叉树有很多特殊的性质,直接研究树会有些麻烦,所以我们通过研究二叉树进而来研究树。
而二叉树的很多特性,可以帮我们解决很多问题,比如与查找问题和排序问题。
4、二叉树的存储
二叉树的存储一般使用链表的方式,也就是二叉链表。
5、遍历二叉树
前序遍历,中序遍历,后序遍历
6、二叉树的建立
以前序遍历的方式为例,建立二叉树。核心是采用递归的方式。
#include <stdlib.h>
#include "conio.h"
#include <stdio.h>
//定义树的结点的结构体
typedef struct TreeNode
{
char data;
struct TreeNode * lchild;
struct TreeNode * rchild;
}TreeNode,*BiTree;
BiTree createtree(BiTree T)
{
char ch;
scanf("%c",&ch);
if(ch == '#')
T = NULL;
else
{
T = (TreeNode *)malloc(sizeof(TreeNode));
T->data = ch;
T->lchild=createtree(T->lchild);
T->rchild=createtree(T->rchild);
}
return T;
}
void pretree(BiTree T)
{
if(T)
{
printf("%c",T->data);
pretree(T->lchild);
pretree(T->rchild);
}
}
int depth_left(BiTree tree)
{
int i;
if(tree == NULL)
{
<span style="white-space:pre"> </span> printf("d");
<span style="white-space:pre"> </span> return 0;
}
else
{
i = depth_left(tree->lchild);
<span style="white-space:pre"> </span>printf("%d\n",i);
<span style="white-space:pre"> </span>return i+1;
}
}
void main()
{
BiTree T;
T = createtree(T);
pretree(T);
}
7、树,二叉树,森林的相互转化
(1)树---》二叉树:把左边第一个孩子放在左边孩子,右边兄弟放在右边孩子
(2)森林--》二叉树:把每棵树转化为二叉树,然后把后一棵树的根节点作为上一棵树右孩子
(3)二叉树--》树
8、赫夫曼树