二叉树基本性质及二叉树链表类

本文介绍了二叉树的基本性质,包括层结点数、总结点数、叶子结点与度为2的结点关系,以及深度与结点数的关系。讨论了满二叉树和完全二叉树的概念,并强调链式存储结构在二叉树实现中的普遍使用。文章还提到了二叉链表的生成规则,并通过示例展示了输入数据与遍历结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

简单概述一下二叉树:二叉树是一种很有用的非线性结构,非空二叉树只有一个根结点,每一个结点最多有两棵子树,左子树和右子树,它具有如下几个基本性质:

性质1  在二叉树的第K层上,最多有2^(k-1)(k>=1)个结点。

性质2  深度为M的二叉树最多有(2^m)-1个结点。

性质3  在任意一颗二叉树中,度为0的结点(即叶子)总是比度为2的结点多一个。

性质4 具有n个结点的二叉树,其深度至少为[log以2为底的n]+1。

满二叉树:除最后一层外,每一层上的所有结点都有两个子结点。

完全二叉树:除最后一层外,每一层上的结点数均达到最大值;最后一层上只缺少右边的若干结点。

性质5 具有n个结点的完全二叉树的深度[log以2为底的n]+1。

二叉树通常采用链式存储结构,除非是满二叉树或完全二叉树适合用顺序存储。

二叉树链表类

#include<iostream>
using namespace std;
template <class T>
struct Btnode
{
	T d;
	Btnode *lchild;
	Btnode *rchild;

};
template <class T>
class Binary_Tree
{
  private:
	  Btnode<T> * BT;
  public:
	  Binary_Tree(){BT=NULL;return;}
	  void create_Binary_Tree(T end);//以end值为结束符值,表示没有该结点
	  void pretrav_Binary_Tree();
	  void intrav_Binary_Tree();
	  void postrav_Binary_Tree();
};
template <class T>
void Binary_Tree<T>::create_Binary_Tree(T end)
{
	Btnode<T> *p;
	T x;
	cin>>x;                                  //输入第一个结点值
	if(x==end)return;                        //第一个值为结束符值
	p=new Btnode<T>;                         //申请二叉链表根结点
	p->d=x;p->lchild=NULL;p->rchild=NULL;
	BT=p;                                    // 二叉树根结点
	create(p,1,end);                          //输入左子结点值
	create(p,2,end);                          //输入右子结点值
	return;
}
template <class T>
static create(Btnode<T> *p,int k,T end)
{
	Btnode<T> *q;
	T x;
	cin>>x;
	if(x!=end)
	{
		q=new Btnode<T>;
		q->d=x;q->lchild=NULL;q->rchild=NULL;
		if(k==1)p->lchild=q;                 //链接到左子树
		if(k==2)p->rchild=q;                 //链接到右子树
		create(q,1,end);                     //输入左子结点值
		create(q,2,end);                     //输入右子结点值
	}
	return 0;
}
template <class T>
void Binary_Tree<T>::pretrav_Binary_Tree()
{
	Btnode<T> *p;
	p=BT;
	pretrav(p);                         //从根结点开始前序遍历
	cout<<endl;
	return;
}
template<class T>
static pretrav(Btnode<T> *p)
{
	if(p!=NULL)
	{
		cout<<p->d<<" ";                  //输出根结点值
		pretrav(p->lchild);                 //前序遍历左子树
		pretrav(p->rchild);               //前序遍历右子树
	}
	return 0;
}
template <class T>
void Binary_Tree<T>::intrav_Binary_Tree()
{
	Btnode<T> *p;
	p=BT;
	intrav(p);
	cout<<endl;
	return;
}
template <class T>
static intrav(Btnode<T> *p)
{
	if(p!=NULL)
	{
		intrav(p->lchild);
		cout<<p->d<<" ";
		intrav(p->rchild);
	}
	return 0;
}
template <class T>
void Binary_Tree<T>::postrav_Binary_Tree()
{
	Btnode<T> *p;
	p=BT;
	postrav(p);
	cout<<endl;
	return;
}
template <class T>
static postrav(Btnode<T> *p)
{
	if(p!=NULL)
	{
		postrav(p->lchild);
		postrav(p->rchild);
		cout<<p->d<<" ";
	}
	return 0;
}


 

应用实例

#include "Binary_Tree.h"
int main()
{
	Binary_Tree<int> b;
	cout<<"输入各结点的值(-1为结束符值):"<<endl;
	b.create_Binary_Tree(-1);
	cout<<"前序序列:"<<endl;
	b.pretrav_Binary_Tree();
	cout<<"中序序列:"<<endl;
	b.intrav_Binary_Tree();
	cout<<"后序序列:"<<endl;
	b.postrav_Binary_Tree();
	return 0;
}


 

特别说明:二叉链表的生成输入规则:(1)输入根结点值(2)若左子树不空,则输入左子树,否则输入一个结束符;(3)若右子树不空,则输入右子树,否则输入一个结束符。生成链表的时候会自动判断到什么地方结束。

例如:输入以下数据:18 20 09 -1 -1 25 47 -1 -1 -1 36 -1 12 06 -1 -1 33 -1 -1

实验结果:

(1)

输入各结点的值(-1为结束符值):
20 -1 -1
前序序列:
20
中序序列:
20
后序序列:
20
Press any key to continue

(2)

(3)

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值