二叉树和其他树

一棵树t是一个非空的有限元素的集合,其中一个元素为,其余的元素(如果有的话)组成t的子树,数根是1级,孩子是2级,一个树的高度或深度为数树中级的个数。一个元素的是指其孩子的个数。叶节点的度为0,一棵树的度是指其元素度的最大值。

二叉树

一棵二叉树是t个有限元素的集合,当二叉树为空时,其中有一个元素称为,余下的元素被划分成两科二叉树,分别称为t的左子树和右子树。
二叉树和树的根本区别是:

  • 二叉树的每个元素都恰好有两棵子树(其中一个或两个可能为空)。而树的每个元素可有任意数量的子树。
  • 在二叉树中,每个元素都是有序的,也就是说,有左子树和右子树之分。而树的子树是无序的。

二叉树的特性

  1. 二叉树有n个元素,n>0,他有n-1条边。
  2. 一棵二叉树的高度为h,h≥0,它最少有h个元素,最多有 2 h − 1 2^h-1 2h1个元素
  3. 一棵二叉树有n个元素,n>0,它的高度最大为h,最小高度为 ⌈ l o g 2 ( n + 1 ) ⌉ \lceil log_2(n+1) \rceil log2(n+1)
    高度为h的二叉树恰好有 2 h − 1 2^h-1 2h1个元素时,称其为满二叉树,对高度为h的满二叉树元素,从第一层到最后一层,在每一层中从左到右,顺序编号,按顺序排列的前k个是完全二叉树

二叉树的描述

二叉树可以用数组描述,但此时浪费空间最大。
用链表描述时,节点有两个指针域分别是leftChild和rightChild,还有一个数据域是element。

template <class T>
struct binaryTreeNode
{
	T element;
	binaryTreeNode<T> *leftChild, //左子树
					  *rightChild;//右子树
	binaryTreeNode(){leftChild = rightChild = NULL;}
	binaryTreeNode(const T& theElement)
	{
		element(theElement)
		leftChild = rightChild = NULL;
	}
	binaryTreeNode(const T& theElement,
				   binaryTreeNode *theLeftChild,
				   binaryTreeNode *theRightChild)
	{
		element(theElement)
		leftChild = theLeftChild;
		rightChild = theRigthChild;
	}
};

在这里插入图片描述

二叉树的遍历

  • 前序遍历
  • 中序遍历
  • 后序遍历
  • 逐层遍历

前序遍历:根->左子树->右子树

template<class T>
void preOrder(binaryTreeNode<T> *t)
{//前序遍历二叉树*t
	if(t != NULL)
	{
		visit(t);			   //访问树根
		preOrder(t->leftChild);//前序遍历左子树
		preOrder(t->rightChild);//前序遍历右子树
	}
}

中序遍历:左子树->根->右子树

template<class T>
void inOrder(binaryTreeNode<T> *T)
{
	if(t != NULL)
	{
		inOrder(t->leftChild);//中序遍历左子树
		visit(t);	//访问树根
		inOrder(t->rightChild);//中序遍历右子树
	}
}

后序遍历:左子树->右子树->根

template<class T>
void postOrder(binaryTreeNode<T> *t)
{
	if(t != NULL)
	{
		postOrder(t->leftChild);//后序遍历左子树
		postOrder(t->rightChild);//后序遍历右子树
		visit(t);//访问树根
	}
}

层次遍历

template<class T>
void levelOrder(binaryTreeNode<T> *t)
{
	arrayQueue<binaryTreeNode<T>*> q;
	while(t != NULL)
	{
		visit(t);			//访问t
		//将t的孩子插入队列
		if(t->leftChild != NULL)
			q.push(t->leftChild);
		if(t->rightChild != NULL)
			q.push(t->rightChild);
		//提取下一个要访问的节点
		try(t = q.front();)
		cathch(queueEmpty){return;)
		q.pop();
	}
}

一棵二叉树有n个元素,四种算法空间和时间复杂性均为 O ( n ) O(n) O(n)

应用

设置信号放大器

在一个分布式网络中,资源从生产地送往其他地方。用术语信号来指称输送的资。信号在网络中传输时,它在某一方面或某几个方面的性能可能会损失或衰减,为了保证信号衰减不超过容忍值,应在网络中至关重要的位置上放置信号放大器。信号放大器可以增加信号的压强或电压使其余源点相同;可以增强信号,使信号与噪声之比与源点的相同。目标是,放大器的数目最少,同时保证信号衰减(与源点相关)不超过给定的容忍值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1) 问题描述 天然气经过管道网络从其生产基地输送到消耗地,在传输过程中,其性能的某一个或几个方面可能会有所衰减(例如气压)。为了保证信号衰减不超过容忍值,应在网络中的合适位置放置放大器以增加信号(例如电压)使其与源端相同。设计算法确定把信号放大器放在何处,能使所用的放大器数目最少并且保证信号衰减不超过给定的容忍值。 2) 基本要求 (1) 建立模型,设计数据结构; (2) 设计算法完成放大器的放置; (3) 分析算法的时间复杂度。 3) 设计思想 为了简化问题,假设分布网络是二叉树结构,源端是的根结点,信号从一个结点流向其孩子结点,中的每一结点(除了根)表示一个可以用来放置放大器的位置。图5是一个网络示意图,边上标出的是从父结点到子结点的信号衰减量。 对于网络中任一结点i,设d(i)表示结点i与其父结点间的衰减量,D(i)为从结点i到结点i的子树中任一叶子结点的衰减量的最大值,并有如下递推公式: 在此公式中,要计算某结点的D值,必须先计算其孩子结点的D值,因而必须后序遍历二叉树,当访问一个结点时,计算其D值。 例如,D(B)=max{D(D)+d(D),D(E)}=4,若容忍值为3,则在B点或其祖先的任意一点放置放大器,并不能减少B与其后代的衰减量,必须在D点放置一个放大器或在其孩子结点放置一个或多个放大器。若在结点D 处放置一个放大器,则D(B)=2。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值