数据结构--树
1,基本术语
1)度:节点有几个孩子叫做几度
2)树的度:各节点中度的最大值
3)有序树:各节点从左至右都是有次序的
2)树的性质
1)节点数=总度数+1
2)树的度(度为m的树)--各节点的度的最大值
任意节点的度<=m,至少有一个节点度为m,一定是非空树,至少有m+1个节点
3)m叉树--每个节点最多只能有m个孩子的树
任意节点的度<=m,最多m个孩子,允许所有节点的度都<m,可以是空树
4)度为m的树第i层至多有m的i-1个节点
3)二叉树
1)满二叉树特点:
只有最后一层有叶子节点
不存在度为1的点
按层序编号,节点i的左孩子为2i,右孩子为2i+1,节点为i的父节点为i/2
2)完全二叉树特点:
只有最后两层可能有叶子
最多只有一个度为1的点
按层序编号,节点i的左孩子为2i,右孩子为2i+1,节点为i的父节点为i/2
i<=n/2为分支节点,i>n/2为叶子节点
3)二叉排序树特点:
左子树上所有节点的关键字都小于根节点的关键字
左子树和右子树又各是一颗二叉排序树
4)平衡二叉树:
左子树和右子树的深度相差小于1
4)二叉树的先中后遍历和层次遍历
#include <queue>
typedef struct tree {//树节点
struct tree* lchild;//指向左孩子的指针
struct tree* rchild;//指向右孩子的指针
int data;//数据域
}tree,*bitree;//tree表示这是一个节点,bitree表示这是一颗树
tree* create() {//创建一颗树
bitree T;
int val;
cin >> val;
if (val == -1)//如果等于-1,返回上一节点,停止往下递归
return NULL;
else {
T = new tree;//T指向根节点
T->data = val;//给根节点赋值val
cout << "请输入左孩子:";
T->lchild = create();//向左递归,创建左子树
cout << "请输入右孩子:";
T->rchild = create();//向右递归,创建右子树
}
return T;
}
void showleft(bitree T) {//左根遍历-根左右
if (T == NULL)//递归遇到null,返回上一节点
return;
cout << T->data << ' ';
showleft(T->lchild);//遍历左孩子
showleft(T->rchild);//遍历右孩子
}
void showmid(bitree T) {//中根遍历-左根右
if (T == NULL)//递归遇到null,返回上一节点
return;
showmid(T->lchild);//遍历左孩子
cout << T->data << ' ';
showmid(T->rchild);//遍历右孩子
}
void showright(bitree T) {//右根遍历-左右根
if (T == NULL)//递归遇到null,返回上一节点
return;
showright(T->lchild);//遍历左孩子
showright(T->rchild);//遍历右孩子
cout << T->data << ' ';
}
void leveshow(bitree T) {//层序遍历
queue<bitree>q;
bitree tmp;
q.push(T);//将根节点入队
while (!q.empty()) {//如果队列为空跳出循环
tmp = q.front();//用tmp保留出队的节点
q.pop();
cout << tmp->data;//打印根节点
if (tmp->lchild != NULL)//如果左孩子不为空,则入队
q.push(tmp->lchild);
if (tmp->rchild == NULL)//如果右孩子不为空,则入队
q.push(tmp->rchild);
}
}