二叉树的创建以及遍历

层序创建二叉树,层序遍历二叉树 在学习树的过程中发现,他们都有一个共同的特点,无论是在创建时还是遍历时,都是需要先父母再左孩子右孩子的顺序如图 层序遍历时顺序为A->B->C->D->E->F->G,先被访问的结点,他的孩子也是先被访问的,层序创建二叉树时,先创建的结点他的孩子也先创建,符合先进先出原则,因此可以用队列来实现。所以他们的共同点就是都可以用队列来帮助实现。 那就先从较为简单的遍历开始吧! 1.层序遍历 思路:刚才分析时我们发现可用队列,第一步,若根节点不为空我们先让根节点入队,判断他的左 阅读详情
#include<iostream>
#include<queue>
using namespace std;
typedef struct tnode
{
	char data;
	struct tnode *lchild,*rchild;
}BTNode;

///建立二叉树
BTNode *CreateTree()
{
	char x;
	BTNode *bt;
	cin>>x;
	if(x=='#')
		bt=NULL;
	else
	{
		bt=(BTNode *)malloc(sizeof(BTNode));
		bt->data=x;
		bt->lchild=CreateTree();
		bt->rchild=CreateTree();
	}
	return bt;
}

BTNode *CreateTree(BTNode *&bt)
{
	char ch;
	ch=getchar();
	if(ch=='#')
	{
		bt=NULL;
	}
	else
	{
		bt=(BTNode *)malloc(sizeof(BTNode));
		if(NULL==bt)
		{
			cout<<"overflow err"<<endl;
			return NULL;
		}
		bt->data=ch;
		CreateTree(bt->lchild);
		CreateTree(bt->rchild);
	}
  return bt;
}

//先序遍历
void PreOrder(BTNode *p)
{
	if(p!=NULL)
	{
		cout<<p->data<<" ";
		PreOrder(p->lchild);
		PreOrder(p->rchild);
	}
}
//中序遍历
void InOrder(BTNode *p)
{
if(p!=NULL)
	{
		PreOrder(p->lchild);
		cout<<p->data<<" ";
		PreOrder(p->rchild);
	}
}
//后序遍历
void PostOrder(BTNode *p)
{
if(p!=NULL)
	{
		PreOrder(p->lchild);
		PreOrder(p->rchild);
		cout<<p->data<<" ";
	}
}
//计算二叉树的深度
int Depth(BTNode *p)
{
 if(p==NULL)
	 return 0;
 int d1=Depth(p->lchild);
 int d2=Depth(p->rchild);
 return (d1>d2?d1:d2)+1;
}
//计算二叉树节点个数
int NodeCount(BTNode *p)
{
	int num1,num2;
	if(p==NULL)
		return 0;
	else
	{
		num1=NodeCount(p->lchild);
		num2=NodeCount(p->rchild);
		return num1+num2+1;
	}
}
//求叶子节点个数
int LeafCount(BTNode *p)
{
	int num1,num2;
	if(p==NULL)
		return 0;
	else if(p->lchild==NULL&&p->rchild==NULL)
		return 1;
	else
	{
		num1=LeafCount(p->lchild);
		num2=LeafCount(p->rchild);
		return num1+num2;
	}
}

//层次遍历,一层层的访问
void LevelOrder(BTNode *p)
{
	queue<BTNode *> qu;
	BTNode *temp;
	qu.push(p); //根入队列
	while(!qu.empty()) //队列不为空
	{
        temp=qu.front();   //出队头
		qu.pop();//删除队头的一个元素
		cout<<temp->data<<" ";  //访问节点

		if(temp->lchild!=NULL)  //有左孩子将其入队
			qu.push(temp->lchild);
		if(temp->rchild!=NULL)
			qu.push(temp->rchild);//有右孩子将其入队

	}

}

void main()
{
  BTNode *bt;
  cout<<"建树将以三个#回车结束"<<endl;
  cout<<"例如:1#2#3#4#5#6###"<<endl;

  bt=CreateTree();

  cout<<"递归先序遍历二叉树"<<endl;
  PreOrder(bt);
  cout<<endl;
  cout<<"递归中序遍历二叉树"<<endl;
  InOrder(bt);
   cout<<endl;
  cout<<"递归后序遍历二叉树"<<endl;
   PostOrder(bt);
   cout<<endl;
   cout<<"树的深度为:"<<Depth(bt)<<endl;
   cout<<"树的节点个数为:"<<NodeCount(bt)<<endl;
   cout<<"叶子节点个数为:"<<LeafCount(bt)<<endl;
   cout<<"树的层次遍历如下:"<<endl;
   LevelOrder(bt);

}

运行结果:


 

 

C++描述

#ifndef _BTREE
#define _BTREE

template <class T>class BinaryTree;

template <class T>
class BinaryTreeNode {
friend class BinaryTree<T>;
public:
BinaryTreeNode() {LeftChild = RightChild = 0;}
BinaryTreeNode(const T& e)
{
	data = e;
 LeftChild = RightChild = 0;}

BinaryTreeNode(const T& e, BinaryTreeNode *l,
BinaryTreeNode *r)
{data = e;
LeftChild = l;
RightChild = r;}

private:
T data;
BinaryTreeNode<T> *LeftChild, //左子树
 *RightChild; // 右子树
};



template<class T>
class BinaryTree {
public:
BinaryTree(){root = 0;};
~BinaryTree() { };
bool IsEmpty( ) const
{return ((root)? false:true);}
bool Root(T& x) const;
void MakeTree(const T& element,BinaryTree<T>& left,BinaryTree<T>& right);
void BreakTree(T& element,BinaryTree<T>& left,BinaryTree<T>& right);

void PreOrder(void(*Visit)(BinaryTreeNode<T> *u))
{ Preorder(Visit,root); }
void InOrder(void (*Visit)(BinaryTreeNode<T> *u))
{ Inorder(Visit,root); }
void PostOrder(void(*Visit)(BinaryTreeNode<T> *u))
{Postorder(Visit, root); }
void LevelOrder(void(*Visit)(BinaryTreeNode<T> *u));

void PreOutput(){Preorder(Output,root);}//按前序方式输出数据域
void InOutput(){Inorder(Output,root); }//按中序方式输出数据域
void PostOutput(){ Postorder(Output,root);}//按后序方式输出数据域。
void Delete( ) { Postorder(Free,root); root = 0;}//删除一棵二叉树
int Height() const {return Height(root);}
private:
BinaryTreeNode<T> *root; // 根节点指针
void Preorder(void (*Visit)(BinaryTreeNode<T> *u),BinaryTreeNode<T> *t);
void Inorder(void(*Visit)(BinaryTreeNode<T> *u),BinaryTreeNode<T> *t);
void Postorder(void(*Visit)(BinaryTreeNode<T> *u),BinaryTreeNode<T> *t);

static void Output(BinaryTreeNode<T> *t)
{ cout << t->data << ' ' ;}
static void Free(BinaryTreeNode<T> *t) {delete t;}

int Height (BinaryTreeNode<T> *t) const;//计算树的高度

};
//成员函数的实现
template<class T>
bool BinaryTree<T>::Root(T& x) const
{// 取根节点的data域,放入x
// 如果没有根节点,则返回false
if (root) 
{
	x = root->data;
   return true;
}
else return false; // 没有根节点
}

template<class T>
void BinaryTree<T>::MakeTree(const T& element, BinaryTree<T>& left, BinaryTree<T>& right)
{// 将left, right和element 合并成一棵新树
// left, right和this必须是不同的树
// 创建新树
 root = new BinaryTreeNode<T>(element, left.root, right.root);
// 阻止访问left和right
left.root = right.root = 0;
}

template<class T>
void BinaryTree<T>::BreakTree(T& element, BinaryTree<T>& left, BinaryTree<T>& right)
{// left, right和this必须是不同的树
// 检查树是否为空
if (!root)  return; // 空树
// 分解树
element = root->data;
left.root = root->LeftChild;
right.root = root->RightChild;
delete root;
root=0;
}
/****************************前序,中序和后序遍历****************/
template<class T>
void BinaryTree<T>::Preorder(void (*Visit)(BinaryTreeNode<T> *u),BinaryTreeNode<T> *t)
{// 前序遍历
if (t) {
Visit(t) ;
Preorder( Visit,t->LeftChild);
Preorder( Visit, t->RightChild);
}
}

template <class T>
void BinaryTree<T>::Inorder(void(*Visit)(BinaryTreeNode<T> *u),BinaryTreeNode<T> *t)
{
if (t) 
{
Inorder(Visit, t->LeftChild);
 Visit(t);
Inorder(Visit, t->RightChild);
}

template <class T>
void BinaryTree<T>::Postorder(void (*Visit)(BinaryTreeNode<T> *), BinaryTreeNode<T> *t)
{// 后序遍历
if(t) 
{
Postorder(Visit, t->LeftChild);
Postorder(Visit, t->RightChild);
Visit(t) 
}

}

template<class T>
void BinaryTree<T>::LevelOrder(void(*Visit)(BinaryTreeNode<T> *u))
{ //逐层遍历


}
template <class T>
int BinaryTree<T>::Height(BinaryTreeNode<T> *t) const
{// 返回树* t的高度
if (!t) return 0; // 空树
int hl = Height(t->LeftChild); // 左子树的高度
int hr = Height(t->RightChild); // 右子树的高度
if (hl > hr) return ++hl;
else return ++hr;
}

}

#endif


主函数调用

#include<iostream>
#include "BinaryTree.h"
using namespace std;

	
void main()
{
	int count=0;
BinaryTree<int> a,x,y,z;
	
	y.MakeTree(1,a,a);
	z.MakeTree(2,a,a);
	x.MakeTree(3,y,z);
	y.MakeTree(4,x,a);
	//cout<<y.Height();
	//y.InOutput();
  // cout<<count<<endl;
}

 Q:分层遍历二叉树

问题1:给定一颗二叉树,要求按分层遍历该二叉树,从上到下,从左到右依次输出(每一层单独输出一行)。

如下的二叉树输出为:

1

2 3

4 5 6

7 8

问题2:写一个函数,打印二叉树中某层次节点(从左到右),其中根节点为第0层,函数原型为int PrintNodeAtLevel(Node * root,int level).成功返回1,失败返回0.

分析与解法:

二叉树数据结构如下:

struct Node
{
int data;
Node * lChild;
Node *rChild;
}

1.解决问题1可以采用先解决问题2,则可以采用遍历各层次节点。

要求访问二叉树中第K层节点,那么可以转换为“以该二叉树根节点的左右子节点为根节点的两颗子树”中层次第k-1层的节点。

代码如下:

int PrintNodeAtLevel(Node * root,int level)
{
if(!root||level<0)
return 0;
If(level==0)
{
cout<<root->data<<” ”;
return 1;
}
return PrintNodeAtLevel(node->lChild,level-1)+ PrintNodeAtLevel(node->rChild,level-1);
}

 

如果知道二叉树的深度为n,那么只需要调用n次PrintNodeAtLevel()

问题1的代码:

void PrintNodeByLevel(Node *root,int depth)
{
for(int level=0;level<depth;level++)
{
PrintNodeAtLevel(root,level);
cout<<endl;
}
}

 

如果事先不知道二叉树的高度,则需要用递归算法求解二叉树的高度,也可以不求二叉树的高度,当访问二叉树某一层失败的时候返回就OK。

不求二叉树高度的方法:

void PrintNodeByLevel(Node *root)
{
for(int level=0;;level++)
{
If(!PrintNodeAtLevel(root,level))
break;
cout<<endl;
}
}

 注:在解决问题1的算法中,对二叉树每一层的访问都要从根节点开始,直到访问完所有的层次,这样的效率很低。

在访问第K层的时候,我们只需要知道第K-1层节点的信息就足够了,所以在访问第K层的时候,要是能知道第K-1层节点的信息,就不要从根节点开始访问。

分析如下:从根节点出发,依次将每层的节点从左到右压入一个数组,并用一个游标Cur记录当前访问的节点,另一个游标Last指示当前层次的最后一个节点的下一个位置,以Cur==Last作为当前层次访问结束的条件,在访问完某一层次的同时将该层的所有节点的子节点压入数组,在访问完某一层之后,检查是否还有新的层次可以访问,直到访问完所有的层次。

具体步骤如下:

a.首先将节点1压入数组,并将游标Cur置于)0,游标Last置于1。

b.Cur<Last说明此层尚未被访问,因此,依次访问Cur到Last之间的所有节点,并依次将被访问节点的左右子节点压入数组中,那么访问完第一层的游标及数组的状态如下图所示:

c.当Cur==Last,说明该层已经被访问完,此时数组中还有未被访问到的节点,则输出换行符,为输出下一行做准备,并将Last定位于新一行的末尾。

如下图:

继续依次往下访问其他节点,知道访问完所有的层次。

代码如下:

void PrintNodeByLevel(Node * root)

{
if(root==NULL)
return ;

vector<Node *>vec;

vec.push_back(root);

int cur=0;
int Last=1;
while(cur<vec.size())
{
Last=vec.size();
while(cur<Last)
{
cout<<vec[cur]->data<<” ”;

if(!vec[cur]->lChild)
vec.push_back(vec[cur]->lChild);

if(!vec[cur]->rChild)
vec.push_back(vec[cur]->rChild);

Cur++;
}
cout<<endl;
}
}

 
DaVinci Configurator实战:从DBC导入到通信栈配置全解析 本文详细解析了如何使用Vector DaVinci Configurator工具,从导入行业标准DBC文件开始,高效完成AutoSAR通信栈(包括COM、PduR、CanIf等模块)的自动化与精细化配置。文章通过实战步骤,重点阐述了DBC导入、与EB MCAL协同、核心模块参数调整及诊断标定服务集成等关键环节,旨在帮助汽车电子工程师快速掌握这一核心工具,提升开发效率与准确性。 阅读详情

相关推荐

Nestjs框架: 集成 Prisma

NestJS官方文档提供了两种数据库相关的内容:Techniques下的数据库板块和Recipes下的具体数据库集成方案。本文以Prisma为例,演示了如何集成Prisma到NestJS项目中。首先创建NestJS项目并安装Prisma,配置MySQL数据库连接。通过Prisma CLI初始化项目、定义数据模型并生成迁移文件。接着创建Prisma模块和服务,配置Prisma客户端连接数据库。最后在控制器中注入PrismaService实现数据查询。整个过程包含了Docker启动MySQL、Prisma模型定

Wang的专栏 1293

数据结构,算法与应用(3)

第8章 二叉树和其他树 1. 术语: 树和二叉树的术语,如高度、深度、层、根、叶子、子节点、父节点和兄弟节点。 4种常用的二叉树遍历方法:前序遍历,中序遍历,后序遍历和按层遍历。 2. 线性数据结构,表数据结构,层次数据结构 3. 二叉树与树的根本区别 4. 二叉树的特性 5. 二叉树遍历方法 在前三种方法中,每个节点的左子树在其右子树之前遍历。这三种遍历的区别在于对同

benpaobagzb的博客 503

保姆级教程:用Wokwi玩转ESP32 MicroPython仿真(含库文件配置指南)

本教程详细介绍了如何使用Wokwi平台进行ESP32 MicroPython仿真开发,包括库文件配置、传感器数据模拟和REPL调试技巧。通过Wokwi的仿真调试系统,开发者可以在浏览器中快速验证代码逻辑,提高开发效率,特别适合物联网项目的快速迭代。

weixin_29195615的博客 443

二叉树的创建和遍历

在数据结构中,树是重要的一个章节,它里面含有着很多的思想,我们在很多的地方也会见到它。尤其是二叉树的知识,让我们有很多的用武之地,在这里,我们就了解一下二叉树的创建还有他的前中后序三种遍历方法,后面我还会写一篇关于他的层序遍历,还有一些计算出度入度的方法。二叉树是一个重要的数据结构,所以我们要认真了解,在整个过程中,我们要人认识到,栈的作用,所以我们对栈的索引,要仔细的引用,思考到每一步的操作。接下来就分享所有的代码。int data;}Tree;//中序遍历//非递归 非递归中序遍历。

z3551906947的博客 4678

使用ShaderGraph制作URP各向异性

URP上用shaderGraph实现各向异性效果,解决只能用shader的问题

dreamform的专栏 1096

CMN-700组件全解析:从XP路由器到HN-F主节点的实战配置指南

本文深入解析Arm CMN-700片上网络IP的核心组件与实战配置。重点剖析了XP网格路由器的拓扑规划与CHI通道管理,以及HN-F全一致性主节点在维护缓存一致性、管理SLC和地址映射中的关键作用。通过一个12×12网格的配置案例,为硬件工程师提供了从组件布局、地址映射到性能调优的系统级设计指南。

weixin_29313423的博客 282

二叉树的创建及遍历方法

在这里我们发现,我们每次存储时,基本上都是按照从上到下,从左到右的方式进行存储的,所以,我们此处存储数据时,可以先把根节点下面的左子树先存放完成,再存放右子树即可实现数据存储,并且,我们存放玩上一个数据之后的每一个节点都可以看做是一个根节点。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左孩子树和右孩子树组成的非空树;按照一般的存储逻辑,我们一般存储都是按照如下编号逐个存储,但是这样的存储方式不太适用于我们的链式存储,因此,这里我们需要使用到递归存储。......

m0_45901455的博客 4万+

如何编写 Skill 实现自动化用例生成

Skill 本质上是一组结构化的指令和工具定义,它告诉 AI 模型在特定场景下应该遵循什么流程、调用哪些工具、输出什么格式的内容。元信息:名称、描述、版本等。指令(Instructions):定义 AI 的行为准则和任务流程。工具(Tools):AI 可以调用的外部能力,如文件读写、代码执行、API 请求等。上下文(Context):预设的输入输出格式或示例。编写一个用于自动生成测试用例的 Skill,核心在于定义清晰的指令流程和输出规范。

Cesare的博客 2690

二叉树的建立和遍历

在二叉树的存储中,我们发现在创建二叉树函数的时候,,它的参数是char* &str,此处的&是c++中的引用,什么是引用呢? 格式为:类型 &引用变量名 = 已定义过的变量名。 例如:,此处的引用b便是a的重命名,怎么理解呢,其实a,b指的是同一个变量,a,b只是他不同的名字。 此处为什么用引用呢,如果去掉引用会发生什么呢? 在数组元素等于ABC##DE##F##G#H## 的时候,输出值会发生错误,发现只在abc之间,不会遍历到后面的元素。怎么样的思路呢,我们递归调用函数时,比如A结点接下来进入左孩子调用

m0_56246173的博客 3535

ARINC429协议分析

如下表所示,ARINC429在发送一帧过程中,首先发送以START开始,以END结束,共发送32bits数据,其中0~7bits为Lable数据,9~8bits为SDI数据,10~28bits为数据,29~30bits为SSM,31bit为校验位End30292827262524校验位SSM2322212019181716DATA15141312111098SDI7654321Start。

5222

如何做好软件需求分析?

软件需求分析也称为系统需求分析或需求分析工程等,是开发人员经过深入细致的调研和分析,准确理解用户和项目的功能、性能、可靠性等具体要求,将用户非形式的需求表述转化为完整的需求定义,从而确定系统必须做什么的过程。软件开发一般包括:可行性分析、需求分析、软件设计、软件开发、软件测试、软件实施、软件服务等步骤,需求分时软件开发的第一步骤。用户需求分析是指在系统设计之前和设计、开发过程中对用户需求所作的调查与分析,是系统设计、系统完善和系统维护的依据。

qq_41854911的博客 1415

按照前序遍历创建二叉树及树的四种遍历方式

利用前序遍历创建二叉树以及树的四种遍历方式

qq_66506742的博客 9787

Python爬取公交线路信息及站点shp数据 文末附数据下载地址

三、现在已经获取到了各个线路名称、链接,以及所途径的上下行站点,那么接下来就应该对开始对第三页url进行信息采集,即本次爬虫的最终目的:爬取所有站点的GPS坐标数据。但坑就坑在,二环一号线属于环线,所以只有左侧有站点数据,而其他非环线车次的站点数据分有上下行,如果用正则匹配,则分不清楚到底哪些是上行站点哪些是下行站点。以前爬过百度地图,当时用的是API平台,加上网站比较规范,所以标签节点什么的都比较清晰,但这次由于特殊原因所选择的网站为公交网,废话不多说直接开始吧。checi=二环一号线。

J_Giser的博客 1316

C++二叉树的创建与遍历

最近学习了二叉树的一点知识,感觉数据结构真的很难啊,所以学习过程中的笔记还是要记录一下。 文章目录一、二叉树二、实现代码三、运行效果四、小结 一、二叉树 在我们使用的数据结构中,一对一的线性结构使我们经常所使用到的,但是现实中却有着许多一对多的情况,这也就产生了“树”这一概念。二叉树则是“树”这一概念中的一种特殊情况,其定义为:“是n(n>=0)个结点的有限集合。该集合或者为空集(称为空二叉...

dayuhaitang1的博客 5139

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

先序遍历创建二叉树并遍历输出

/* 文件名:1_1_3_2.cpp 作者:汤善康 日期:2019年7月7日 */ #include<stdio.h> #include<stdlib.h> #include<malloc.h> typedef int Status; typedef char BTelemtype; typedef struct BInode { BTelemtype data...

beMOREexcellent的博客 5119

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

C语言二叉树的创建与遍历

二叉树(binary tree)是指树中节点的度不大于2的有序树,它是一种最简单且最重要的树。二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。以下是对链式存储结构的二叉树的创建与先序、中序、后序遍历操作。

le123didi的博客 1万+

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

二叉树创建以及遍历

二叉树创建以及遍历 题目描述 编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。 输入描述 : 输入包括1行字符串,长度不超过100。 输出描述 : 可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。 示例1 输入 复制 abc#

qq_45672975的博客 1161

二叉树的创建与遍历

二叉树有多种不同的遍历方法,比如先序遍历(preorder traversal)、中序遍历(inorder traversal)和后序遍历(postorder traversal)。例如,先序遍历通常用于复制一棵二叉树,中序遍历通常用于排序,后序遍历通常用于计算一棵二叉树的高度。

kashine的博客 6553

二叉树的创建及遍历

1.为什么pre要写在private域内,而preOrder要写在public域内?提供一个接口,允许外部代码请求执行前序遍历操作,而不需要知道类的内部实现细节。如果将来类的内部实现需要改变(例如,改变遍历的顺序或算法),只需要修改。保护类的内部状态和实现细节,防止外部代码直接操作这些私有部分。3.为什么有了pre,又要有preOrder?四、二叉树的遍历(前序、中序、后序和层次遍历)函数的实现,而不需要修改任何外部代码。函数的实现,而不需要修改任何外部代码。如果类的内部实现需要改变,只需要修改。

2303_80087291的博客 1047

python实现二叉树的创建、前序遍历、中序遍历以及层次遍历

注意输入的格式,如下图,D结点的孩子结点,空结点用#代替,直到最后一层就可以停止输入,以下面这棵树为例,则我们的输入为ABCDE#F##G#####第二步,访问,D、G、E、B这棵左子树,同理可得,可以先把B写在最后,然后在访问左子树和右子树,以此类推…第二步,分析左子树,同理可得,先把B写在中间,因为只有D是B的左子树,那么D肯定在B的左边,以此类推…第二步,访问B、D、E、G子树的根结点B,然后是D这棵左子树和E、G这棵右子树。第一步,访问根结点A,然后是B、D、E、G这棵左子树和C、F右子树。....

sally的jerry 5651

二叉树的创建和遍历实现

二叉树的递归定义为:二叉树是一棵空树,或者是一棵由一个根节点和两棵互不相交的,分别称作根的左子树和右子树组成的非空树;左子树和右子树又同样都是二叉树。 既然二叉树是通过递归定义的,所以想要创建一颗二叉树,这里可以借助递归去创造。

保持一颗永远好奇、勇于探索的心 2669

【数据结构】——创建二叉树,以及二叉树的遍历

如何创建一颗二叉树? 先创建一个根结点 通过这个根结点,创建它的左节点和右节点 再为它的左节点和右节点分别创建左节点和右节点 依次递归 创建一颗静态的二叉树 就是我们直接创建结点,为结点赋值,然后将结点连接起来,就形成了一颗二叉树 首先,创建一个结点类 一个结点的信息包括:结点的值、它的左结点、它的右结点 在结点类中实现两个方法 设置左节点:传入一个结点参数,将传入的结点设置...

她的坏机器人 906
上一篇: 队列的线性存储和链式存储实现
下一篇: 【排序算法】直接插入排序与希尔(Shell)排序
xiaoding133
博客等级 码龄19年 415粉丝 159原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值