树的基本概念
树的度:树内各结点的度的最大值
结点的度:结点的子女个数
树中结点数 = 总分叉数 +1。(这里的分叉数就是所有结点的度之和)
分支结点:度不为0的结点
叶子结点:度为0的结点
二叉树的基本概念
满二叉树:一颗深度为k且又2^k-1个节点的二叉树成为满二叉树。
完全二叉树:(人话)最后一行可不全,但是左侧叶子节点是没有空位的。
线索二叉树:在二叉树的基础上,结点结构除数据区域外,还有l®child、l®tag、四个区域,其中tag区域等于0则表示节点有(左/右)孩子,child指向孩子节点;若等于1,则表示无孩子结点,lchild则指向节点的前驱,rchild指向结点的后继,其中前驱和后继是哪个结点是由二叉树遍历顺序(前、中、后)决定的。
赫夫曼树(最优二叉树):
路径长度:从树的一个结点到另一个结点之间的分支构成这两个结点之间的路径,路径上的分支数目称为路径长度
树的路径长度:从树根到每个结点的路径长度之和
树的带权路径长度:树中所有叶子结点的带权路径长度之和:
最优二叉树(赫夫曼树):带权路径长度WPL最小的二叉树
二叉排序树:空树或每个结点左孩子比自己小,右孩子比自己大
平衡二叉树:左子树和右子树的深度之差的绝对值不超过1,且左子树和右子树也均为平衡二叉树
平衡因子:该结点左子树深度减去右子树深度,平衡二叉树的平衡因子为-1、0、1
二叉树的计算
二叉树叶节点个数为n0,次数为2结点个数为n2,则有n0=n2 + 1;(叶子节点个数 = 度为2的结点个数+1)
在包含n个结点的二叉树的链接存储中,需要2n个指针域,但是,其中只有n-1个用来指示结点的左右孩子,其余n+1个指针域为空
空指针域数等于非空指针域数加2
二叉树的创建(C++代码)
#include<iostream>
using namespace std;
class Point{
int data;
Point *left;
Point *right;
public:
int getdata();
bool setdata(int data);
Point *getleft();
bool setleft(Point *left);
Point *getright();
bool setright(Point *right);
};
int Point::getdata(){
return this->data;
}
bool Point::setdata(int data){
this->data = data;
}
Point *Point::getleft(){
return this->left;
}
bool Point::setleft(Point *left){
this->left = left;
}
Point *Point::getright(){
return this->right;
}
bool Point::setright(Point *right){
this->right = right;
}
class BinTree{
Point *root;
int amount;
public:
BinTree();
Point *getroot();
int getamount();
};
BinTree::BinTree(){
Point *p = new Point();
p = root;
amount = 1;
}
Point *BinTree::getroot(){
return root ;
}
int BinTree::getamount(){
return amount ;
}
Point *root;
Point* dfs(Point *f){
int x;
cin>>x;
if(x==0)
return NULL;
f=new Point();
f->setdata(x);
f->setleft(dfs(f->getleft()));
f->setright(dfs(f->getright()));
return f;
}
void show(Point *f){
cout<<f->getdata()<<endl;
if(f->getleft()!=NULL)
show(f->getleft());
if(f->getright()!=NULL) {
show(f->getright());
}
}
main(){
root =dfs(root);
show(root);
}