【算法导论】二叉树的建立

二叉树的建立

基本概念:

        有序树与无序树:若将树中的每个节点的各个子树都看成是从左到右有次序的,则称该树为有序树,否则为无序数。

        顺序存储:从根节点起,自上而下,从左至右的方式对节点进行顺序编号,编号即对应为要存储的数组的下标。于是节点与数组元素就一一对应了。

        满二叉树、完全二叉树、非完全二叉树的区别:

二叉树的性质:

性质1  在二叉树的第i层上至多有2i1个结点(i≥1)

性质2  深度为k的二叉树至多有2k-1个结点(k≥1)

性质3  对任何一棵二叉树,如果其终端结点数为n0,度为2的结点数为n2,则n0=n2+1

性质4  具有n个结点的完全二叉树的深度为ëlog2nû+1或élog2(n+1)ù。其中ëxû表示不大于x的最大整数,éxù表示不小于x的最小整数。

二叉树建立的基本思想:依次从原数组中读取结点信息,建立一个新结点来存储这个元素信息。若新结点是第一个结点,则令其为根结点,否则将新结点作为孩子链接到它的双亲结点上。如此反复进行,直到数组元素全部读完为止。为了使新结点能够与双亲结点正确相连,并考虑到这种方法中先建立的结点其孩子结点也一定先建立的特点,可以设置一个指针类型的数组构成的队列来保存已输入结点的地址,并使队尾(rear)指向当前输入的结点,队头(front)指向这个结点的双亲结点。由于根结点的地址放在队列的第一个单元里,所以当rear为偶数时(注意根节点不是数组的第一个元素),则rear所指的结点应作为左孩子与其双亲链接,否则rear所指的结点应作为右孩子与其双亲链接。若一个双亲结点与两个孩子链接完毕,则进行出队操作,使队头指针指向下一个待链接的双亲结点。

具体算法如下:

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

#define maxsize 10
typedef int datatype;
typedef struct node
{
	datatype data;
	struct node *lchild,*rchild;
} bitree;//二叉树的节点结构

bitree* CreatBitree(int* arrayA,int n);//创建二叉树(以顺序存储方式)
void preorder(bitree *p);//先序遍历算法
void midorder(bitree *p);//中序遍历算法
void postorder(bitree *p);//后序遍历算法

void main()
{
	int arrayA[9]={0,1,2,3,4,5,6,7,8};//第一个节点没有用于存储数据,是为了方便计算
	int n=sizeof(arrayA)/sizeof(int);

	bitree *head=NULL;//初始化指向链表的头指针

	head=CreatBitree(arrayA,n);//建立链表

}

bitree* CreatBitree(int* arrayA,int n)//顺序存储 建立二叉树
{
	bitree *root;
	bitree *queue[maxsize];//队列用于保存已输入节点的地址
	bitree *p;
	int front,rear;
	front=1;rear=0;//指向队列的头尾
	root=NULL;

	for(int i=1;i<n;i++)
	{
		p=(bitree*)malloc(sizeof(bitree));//创立节点并赋值
		p->data=arrayA[i];
		p->lchild=NULL;
		p->rchild=NULL;

		rear++;
		queue[rear]=p;

		if(rear==1)//判断是否为输入的第一个节点
			root=p;
		else
		{
			if(i%2==0)//新节点为左孩子
				queue[front]->lchild=p;
			else//新节点为右孩子
			{
				queue[front]->rchild=p;
				front=front+1;
			}
		}

	}

	return root;
}

原文:http://blog.csdn.net/tengweitw/article/details/9786571

作者:nineheadedbird

时间: 2024-10-31 05:43:33

【算法导论】二叉树的建立的相关文章

【算法导论】求二叉树的叶子数和深度

二叉树的叶子数和深度 二叉树的遍历算法是许多二叉树运算的算法设计的基础,因此遍历算法的应用很广泛.下面以遍历算法求二叉树的叶子数和深度为例,来加深对于二叉树遍历算法的理解.1. 统计二叉树中的叶子结点数因为叶子结点是二叉树中那些左孩子和右孩子均不存在的结点,所以可在二叉树的遍历过程中,对这种特殊结点进行计数,来完成对叶子结点数的统计.这个统计可在任何一种遍历方式下给出,下面是利用中序遍历来实现的算法: /**********************************************

【算法导论】排序 (二):堆排序

四.(1)堆排序 第一次听堆排序是在107lab听忠哥讲的,但是没讲怎么实现.那时刚看了数据结 构的二叉树,还以为要通过指针建立二叉树的方式来实现,觉得挺难的. 其实堆排序实现没有想象中 的那么难. "堆"这个词最初是在堆排序中提出来的,但后来就逐渐指"废料收集储存区",就像程 序设计语言Lisp和Java中所提供的设施那样.我们这里的堆数据结构不是废料收集存储区. 堆排序的 运行时间与归并排序一样为O(n lg n),  但是一种原地(in place)排序. (

高效算法的常用技术(算法导论)

对于高效算法, 有些比较简单的技术, 如分治法, 随机化, 和递归求解技术. 这边介绍些更为复杂的技术, 动态规划, 贪心算法 当对于复杂问题设计算法时, 首先会想到使用分治法 来解决, 分而治之, 一个很有哲理性的思路, 再复杂的问题都可以不断分解到你可以轻松解决的粒度, 把所有简单问题都解决完后, 组合在一起就得到了复杂问题的解, 可以看出其中典型的递归求解的思路. 使用分治法的要求, 各个子问题是独立 的 (即不包含公共的子子问题,子问题不重叠 ). 如果子问题重叠, 用分治法就比较低效,

基本数据结构(算法导论)与python

Stack, Queue Stack是后进先出, LIFO, 队列为先进先出, FIFO 在python中两者, 都可以简单的用list实现, 进, 用append() 出, Stack用pop(), Queue用pop(0), pop的时候注意判断len(l)  对于优先队列, 要用到前面讲到的堆 链表和多重数组 这些数据结构在python中就没有存在的价值, 用list都能轻松实现 散列表 为了满足实时查询的需求而产生的数据结构, 查询复杂度的期望是O(1), 最差为O(n) 问题描述, 对

【算法导论】二叉排序树

二叉排序树 二叉排序树的性质:每个节点的左子树中的所有节点的关键字都小于该节点的关键值,而右子树中的所有节点的关键字都大于该节点的关键值.  二叉排序树的构造 二叉排序树的构造是指将一个给定的数据元素构造为相应的二叉排序树. 基本思想为: 对于任给的一组数据元素{ R1, R2, -, Rn } , 可按以下方法来构造二叉排序树:         (1) 令R1为二叉树的根;          (2) 若R2<R1, 令R2为R1左子树的根结点,否则R2为R1右子树的根结点:         (

【算法导论】红黑树

红黑树          在了解红黑树之前,我们必须先了解二叉搜索树(又称二叉排序树,我在上一篇文章中有介绍),因为红黑树是一种特殊的二叉排序树:在每个节点上增加一个存储位来表示节点的颜色,因此红黑树共有五个域:color,key,lchild,rchild,p.          红黑树的提出:一个高度为h的二叉排序树可以实现任何一种基本的动态集合操作:插入.删除.查找等操作,但是当树才高度比较高时,二叉树就会退化成链表.而红黑树能确保在最坏的情况下,基本的动态集合操作的时间为O(logn).

【算法导论】排序(一)

虽然久闻大名,但第一次接触算法导论,是看了网易公开课MIT的<算法导论>课,记得 第一集就讲到了 插入排序和归并排序. 几个星期前也买了算法导论这本书,准备慢慢啃~ 这星期主要在看前两 部分,除了对于讲渐进时间.递归式分析这些东西感到云里雾里的,其它的都就 感觉越看越有觉得入 迷,果然不愧是一本经典之作 好吧,开始.本文主要是用C++把书中的算法实现,以及一些笔记. 一.插入排序. 插入算法的设计使用的是增量(incremental)方法:在排好子数组A[1..j- 1]后,将 元素A[ j]

C++编程:C++归并排序实现(算法导论)

  算法导论上的下标是从1开始的,但是为了和c++ STL的设计思想一致,所有函数的实现统一用左闭右开区间.中间修改了很多次,因为下标修改不是很容易就改掉的,需要始终维持循环不变式,稍微一个步骤出错就会使结果有些错误. #include #include #include #include using namespace std; void merge(int *A, int p, int q, int r) { //merge [p, r),左闭右开区间 int n1 = q - p, n2

JavaScript数据结构和算法之二叉树详解

 这篇文章主要介绍了JavaScript数据结构和算法之二叉树详解,本文讲解了二叉树的概念.二叉树的特点.二叉树节点的定义.查找最大和最小值等内容,需要的朋友可以参考下     二叉树的概念 二叉树(Binary Tree)是n(n>=0)个结点的有限集合,该集合或者为空集(空二叉树),或者由一个根结点和两棵互不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点 每个结点最多有两棵子树,所以二叉树中不存在度大于2的结点.二叉树中每一个节点都是一个对象,每一个数据节点都有三个指针,