树的定义:
-
1、有且只有一个称为根的节点。
-
2、有若干个互不相交的子树,这些子树本身也是一棵树。
-
深度:从根节点到最底层节点的层数称之为深度。
-
叶子节点:没有子节点的节点。
-
非终端节点:非叶子节点。
-
度:子节点的个数称为度。
-
叶子节点:没有子节点的节点。
图中A的度为3,C的度为1,F的度为0;
此数的深度为3。
- 一般树:任意一个节点的子节点的个数都不受限制。
- 二叉树:任意一个节点的子节点的个数最多为两个,且位置不能改变。
- 森林:n个还不相交的数的集和。
二叉树的性质
- 性质1:二叉树的第i层上至多有
个节点。
- 性质2:深度为k的二叉树至多有
个节点。 - 性质3:对于任何一颗二叉树T,如果其终端节点数为n0,度为2的节点数为n2,则n0=n2+1。
二叉树的分类
- 一般二叉树
- 满二叉树
- 完全二叉树:如果只是删除满二叉树最底层最右边的连续若干个节点,形成的二叉树为完全二叉树。
树的存储
-
链式存储
-
一般树存储
-
森林存储
链式存储
代码如下:
//链式二叉树
#include<iostream>
#include<malloc.h>
#include<stdio.h>
using namespace std;
typedef struct BTnode
{
char data; //存储的数据
struct BTnode * pLchild; //左孩子
struct BTnode * pRchild; //右孩子
}node,*NODE;
NODE creatBTree(); //建立树
void PreTraverseBTree(NODE); //先序遍历
void MinTraverseBTree(NODE); //中序遍历
void PostTraverseBTree(NODE); //后序遍历
int main()
{
NODE pt=creatBTree();
cout<<"先序遍历"<<endl;
PreTraverseBTree(pt); //先序遍历
cout<<"中序遍历"<<endl;
MinTraverseBTree(pt); //中序
cout<<"后序遍历"<<endl;
PostTraverseBTree(pt); //后序
return 0;
}
void PostTraverseBTree(NODE pt) //后序遍历
{
if(pt!=NULL)
{
if(pt->pLchild!=NULL)
{
MinTraverseBTree(pt->pLchild);
}
if(pt->pRchild!=NULL)
{
MinTraverseBTree(pt->pRchild);
}
cout<<pt->data<<endl;
}
//先访问左子树
//在访问右子树
//在访问根节点
}
void MinTraverseBTree(NODE pt) //中序遍历
{
if(pt!=NULL)
{
if(pt->pLchild!=NULL)
{
MinTraverseBTree(pt->pLchild);
}
cout<<pt->data<<endl;
if(pt->pRchild!=NULL)
{
MinTraverseBTree(pt->pRchild);
}
}
//先访问左子树
//在访问根节点
//在访问右子树
}
void PreTraverseBTree(NODE pt)
{
if(pt!=NULL)
{
cout<<pt->data<<endl;
PreTraverseBTree(pt->pLchild);
PreTraverseBTree(pt->pRchild);
}
//pt->pLchild 可以代表整个左子树
//先访问根节点
//在访问左子树
//在访问右子树
}
NODE creatBTree()
{
NODE PA=(NODE)malloc(sizeof(node));
NODE PB=(NODE)malloc(sizeof(node));
NODE PC=(NODE)malloc(sizeof(node));
NODE PD=(NODE)malloc(sizeof(node));
NODE PE=(NODE)malloc(sizeof(node));
PA->data='A';
PB->data='B';
PC->data='C';
PD->data='D';
PE->data='E';
PA->pLchild=PB;
PA->pRchild=PC;
PB->pLchild=PB->pRchild=NULL;
PC->pLchild=PD;
PC->pRchild=NULL;
PD->pLchild=NULL;
PD->pRchild=PE;
PE->pLchild=PE->pRchild=NULL;
return PA;
}
链表中建立的树如图所示