数据结构之“树”关键点学习笔记

二叉树的三种遍历方式(递归算法)

I、先序遍历(每个子树的根结点最先遍历)

//T为树的某个结点
//lchild为左子结点,rchild为右子结点
void PreOrder(Tree T){
	if(T!=NULL)
	{
		visit(T);
		PreOrder(T->lchild);
		PreOrder(T->lchild);
	}	
}

在这里插入图片描述
访问顺序为(左子结点->右子结点->根结点)
1->2->4->5->3->6

II、中序遍历(每个子树的根结点不最先也不最后的遍历)

void InOrder(T)
{
	if(T!=NULL)
	{
		InOrder(T->lchild);
		visit(T);
		InOrder(T->rchild);
	}
}		

在这里插入图片描述
访问顺序为(左子结点->根结点->右子结点)
4->2->5->1->6->3

III、后序遍历(根结点最后遍历)

void PostOrder(T)
{
	if(T!=NULL)
	{
		PostOrder(T->lchild);
		PostOrder(T>rchild);
		visit(T);
	}
}		

在这里插入图片描述
访问顺序为(左子结点->右子结点->根结点)
4->5->2->6->3->1

遍历二叉树的非递归算法

I、中序遍历(栈)

懒得用文字描述过程了,上代码

void InOrder(T)
{
	InitStack(S);
	while(p!=NULL||IsEmpty(S))
	{
		if(p)
		{
			Push(S,p);(将p结点入栈)
			p=p->lchild;
		}
		else
		{
			Pop(S,p);(出栈)
			visit(p);
			p=p->rchild;
		}
	}
}			

II、层次遍历(队列)(广度优先搜索)

懒得写代码了,上文字
算法思想:
1)初始将根入队并访问根结点,然后出队(先入队再访问)
2)若有左子树,将左子树的根入队;
3)若有右子树,将右子树的根入队;
4)然后出队,访问该结点
5)反复直到队列为空
(脑中要有一张图,一边入队,另一边出队)

由遍历序列构造二叉树

1、只有一种遍历序列不能确定一棵二叉树。
2、后/先序和中序可以确定一棵。(这里的“和”是组合,是一起用)
3、先序和后序不能确定一棵。
4、层次遍历加中序也可以确定一棵
5、具体实现方法以后再来完善(咕咕咕)

二叉树的四种建树方式

先序建树、中序建树、后序建树

这三种建树方式与之前同序的遍历方式的代码几乎一样,只是将访问的那一步变成申请内存空间和将值存入结点(还要判断是否应在该处将值存入)

层序建树

也是用队列,但比遍历要麻烦一点,直接放代码

tree *Create()
{
	queue<tree*>q;//层序遍历中需要的队列 
	tree *t,*head,*temp;
	if(v.empty())//数组为空 
	{
		return NULL;
	}
	t=(tree*)malloc(sizeof(tree));
	t->data=v.front();//建立根结点 
	v.pop();//将数组第一个元素去掉 
	head=t;//存下根结点,方便return 
	q.push(t);//将该结点入队 
	while(q.size())//存结点的队列不为空 
	{
		temp=q.front();//记录队列头部元素 
		q.pop();//出队 
		temp->lchild=NULL;//先把儿子结点定为NULL 
		temp->rchild=NULL;
		
		if(v.size())//建立左儿子结点 
		{
			t=(tree*)malloc(sizeof(tree));
			t->data=v.front();//建立结点 
			v.pop();//去掉数组首元素 
			temp->lchild=t;//将该子结点与双亲结点连上 
			q.push(t);//将该结点入队 
		}
		if(v.size())//建立右儿子结点 
		{
			t=(tree*)malloc(sizeof(tree));
			t->data=v.front();
			v.pop();
			temp->rchild=t;
			q.push(t);
		}
	}
	return head;
}

求树深度

从别人那学到的方法,比我自己写的要简洁多了

int Height(tree *t)//t为该树的根结点 
{
    if (t==NULL)
    {
    	return 0;
	}
    return max(Height(t->lchild),Height(t->rchild))+1;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python学习笔记完整的话题很广泛,这里只能提供一个简单的概述。Python是一种高级编程语言,易于学习和使用,它在各个领域都有广泛的应用。以下是一些学习Python的关键点: 1. 安装Python:首先,你需要安装Python解释器。你可以从官方网站(https://www.python.org)下载适合你操作系统的版本,并按照官方指南进行安装。 2. 语法基础:学习Python的第一步是了解其基本语法。掌握变量、数据类型、运算符、条件语句、循环结构等基本概念。你可以通过阅读教程或参考Python官方文档来学习。 3. 数据结构:了解Python中常用的数据结构,如列表、元组、集合和字典。这些数据结构对于存储和操作数据非常重要。 4. 函数和模块:学习如何定义和调用函数,以及如何将代码组织成模块。了解如何使用Python标准库中的模块来扩展功能。 5. 文件操作:学习如何读写文件,并了解文件处理的常用技巧。这对于处理文本文件、CSV文件和JSON文件等非常有用。 6. 异常处理:了解如何使用异常处理机制来捕获和处理错误。这有助于编写更健壮和可靠的代码。 7. 面向对象编程:学习如何使用面向对象编程(OOP)的概念和技术。掌握类、对象、继承和多态等概念。 8. 数据库操作:了解如何使用Python连接和操作数据库。学习SQL语言和Python数据库API(如SQLite、MySQL或PostgreSQL)。 9. Web开发:学习使用Python开发Web应用程序。了解基本的Web开发框架(如Django或Flask)和前端技术(如HTML、CSS和JavaScript)。 10. 数据分析和机器学习学习如何使用Python进行数据分析和机器学习。掌握常用的数据分析库(如NumPy和Pandas)和机器学习库(如Scikit-learn)。 以上只是Python学习的一些基本方面,你可以根据自己的兴趣和目标进一步深入学习和实践。记住,不断练习和实践是提高编程能力的关键!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值