树及二叉树的基本知识&二叉树的创建(C++)

本文介绍了树和二叉树的基本概念,包括结点度、分支结点、叶子结点等,并详细阐述了满二叉树、完全二叉树和线索二叉树的定义。此外,讨论了赫夫曼树(最优二叉树)及其性质,以及二叉排序树和平衡二叉树。最后,给出了二叉树的C++实现,包括创建和显示二叉树的代码。
摘要由CSDN通过智能技术生成

树的基本概念

树的度:树内各结点的度的最大值
结点的度:结点的子女个数
树中结点数 = 总分叉数 +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);
}


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值