【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

这篇具有很好参考价值的文章主要介绍了【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

🎊专栏【数据结构】

🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。

🎆音乐分享【勋章】

大一同学小吉,欢迎并且感谢大家指出我的问题🥰

目录

⭐树

🏳️‍🌈定义

 🏳️‍🌈注意

🍔树的基本术语

⭐二叉树

🏳️‍🌈定义

🎆二叉树和树的区别

🏳️‍🌈二叉树的性质

⭐满二叉树

⭐完全二叉树

🎁遍历二叉树

🎈先序遍历二叉树

🎈中序遍历二叉树

🎈后序遍历二叉树

🎁构建二叉树

🎈算法步骤

🎈代码

🎁复制二叉树

🎈算法步骤

🎈代码

🎁计算二叉树的深度

🎈算法步骤

🎈代码

🎁统计二叉树中结点的总数

🎈算法步骤

🎈代码

🎁统计二叉树中叶子结点的个数

🎈算法步骤

🎈代码

🎊完整代码 


 文章来源地址https://www.toymoban.com/news/detail-451812.html

 

⭐树

🏳️‍🌈定义

树是n(n>=0)个结点的有限集

n=0:称为空树

n>0:称为非空树

✨对于非空树,有下面两个特点

(1)有且只有一个称为根的结点

(2)除根节点之外的其余结点可以分为m(m>0)个互不相交的有限集,对于每一个有限集本身又是一棵树,并且称为根的子树

树可以有多种表示方法,如下图所示 

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

 🏳️‍🌈注意

如下图所示

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

 

🍔树的基本术语

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

结点:树的一个独立单元(比如上图的ABCD)

结点的度:结点拥有的子树(比如上图中,A的度为3,B的度为2)

树的度:树内各结点度的最大值(比如上图的树的度为3)

叶子(终端结点):度为0的结点

层次:结点的层次从根开始定义,根为第一层,根的孩子为第二层

树的深度(高度):树中结点的最大层次

森林:m棵互不相交的树的集合。对于树的每个结点而言,其子树的集合就是森林

⭐二叉树

🏳️‍🌈定义

树是n(n>=0)个结点的有限集

n=0:称为空树

n>0:称为非空树

✨对于非空树,有下面两个特点

(1)有且只有一个称为根的结点

(2)除根节点之外的其余结点可以分为2个互不相交的子集,分别称为T的左子树T1和右子树T2,且T1T2都是二叉树

🎆二叉树和树的区别

🚥二叉树中不存在度>2的结点🚥

二叉树的左右子树有左右之分,不能随意颠倒


二叉树也有多种表示方法,如下图所示

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作 

🏳️‍🌈二叉树的性质

🎈第i层上至多有2^(i-1)(i>=1)个结点

🎈深度为k的二叉树至多有2^k-1(k>=1)个结点

🎈对于任何一颗二叉树T,如果其终端结点树为n0,度为2的结点树为n2

那么n0=n2+1

⭐满二叉树

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

深度为k且有2^k-1个结点的二叉树,每一层的结点数都是最大结点数

⭐完全二叉树

【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作

 

深度为k,有n个结点的二叉树,当且仅当每一个结点都与深度为k的满二叉树 中编号从1到n的结点一一对应时,为完全二叉树


文末有完整代码


 

🎁遍历二叉树

🎆定义

typedef struct BiNode{				
    char data;
    struct BiNode *lchild,*rchild;
}BiNode,*BiTree;

🎈先序遍历二叉树

操作定义如下:若二叉树为空,则操作为空;否则
(1)访问根结点;
(2)先序遍历左子树;
(3)先序遍历右子树。

void preorder_traversal(BiTree root) {
    if (!root) {
        return;
    }

    cout << root->data << " "; // 访问根节点
    preorder_traversal(root->lchild); // 递归访问左子树
    preorder_traversal(root->rchild); // 递归访问右子树
}

🎈中序遍历二叉树

操作定义如下:若二叉树为空,则操作为空;否则
(1)中序遍历左子树;
(2)访问根结点;
(3)中序遍历右子树。

void inorder_traversal(BiTree root) {
    if (!root) {
        return;
    }

    inorder_traversal(root->lchild); // 递归访问左子树
    cout << root->data << " "; // 访问根节点
    inorder_traversal(root->rchild); // 递归访问右子树
}

🎈后序遍历二叉树

操作定义如下:若二叉树为空,则操作为空;否则
(1)后序遍历左子树;
(2)后序遍历右子树;
(3)访问根结点;

void postorder_traversal(BiTree root) {
    if (!root) {
        return;
    }

    postorder_traversal(root->lchild); // 递归访问左子树
    postorder_traversal(root->rchild); // 递归访问右子树
    cout << root->data << " "; // 访问根节点
}

🎁构建二叉树

法一:

比如根据  ABC##DE#G##F###  这一段来构建

🎈算法步骤

1.读取字符序列,读入字符ch

2.如果ch是“#”,表明该二叉树为空树,即T为NULL,否则执行下面的操作

(1)申请一个内存空间T

(2)将ch赋给T->data

(3)递归创建T的左子树

(4)递归创建T的右子树

🎈代码

void CreateBiTree(BiTree &T){	
	
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								
}					

法二:

 // 构建二叉树
    BiTree root = new BiNode{'A', nullptr, nullptr};
    root->lchild = new BiNode{'B', nullptr, nullptr};
    root->lchild->lchild = new BiNode{'C', nullptr, nullptr};
    root->lchild->rchild = new BiNode{'D', nullptr, nullptr};
    root->lchild->rchild->lchild = new BiNode{'E', nullptr, nullptr};
    root->lchild->rchild->lchild->rchild = new BiNode{'G', nullptr, nullptr};
    root->lchild->rchild->rchild = new BiNode{'F', nullptr, nullptr};

🎁复制二叉树

🎈算法步骤

1.为空树,递归结束

2.不为空树,那么执行下面的操作

(1)申请一个新结点空间,复制根节点

(2)递归复制左子树

(3)递归复制右子树

🎈代码

void Copy(BiTree T,BiTree &NewT)
{
	if(T==NULL){
		NweT=NULL;
		return;
	}else{
		NewT=new BiTree;		//复制根节点
		NewT->data=T->data;
		Copy(T->lchild,NewT->lchild);
		Copy(T->rchild,NewT->rchild);
	}
}

🎁计算二叉树的深度

🎈算法步骤

1.为空树,递归结束

2.不为空树,那么执行下面的操作

(1)递归计算左子树的深度为m

(2)递归计算右子树的深度为n

(3)如果m>n,那么二叉树深度为m+1,否则为n+1

🎈代码

int Depth(BiTree T)
{ 
	int m,n;
	if(T == NULL ) return 0;        //如果是空树,深度为0,递归结束
	else 
	{							
		m=Depth(T->lchild);			//递归计算左子树的深度记为m
		n=Depth(T->rchild);			//递归计算右子树的深度记为n
		if(m>n) return(m+1);		//二叉树的深度为m 与n的较大者加1
		else return (n+1);
		//+1,所以可以计算出来
	}
}

🎁统计二叉树中结点的总数

🎈算法步骤

如果是空树,那么结点个数为0,递归结束

否则,结点个数=左子树结点个数+右子树结点个数+1

🎈代码

int NodeCount(BiTree T)
{
     if(T==NULL) return 0;  			// 如果是空树,则结点个数为0,递归结束
     else return NodeCount(T->lchild)+ NodeCount(T->rchild) +1;
     //否则结点个数为左子树的结点个数+右子树的结点个数+1
     
     //+1,所以可以计算出来//
} 

🎁统计二叉树中叶子结点的个数

🎈算法步骤

如果是空树,那么结点个数为0,递归结束

否则,遍历到NULL,即叶子节点

🎈代码

int LeafCount(BiTree T){
 	if(T==NULL) 	//如果是空树返回0
		return 0;
	if (T->lchild == NULL && T->rchild == NULL)
		return 1; //如果是叶子结点返回1
		
		// 1,所以可以计算出来
		
	else return LeafCount(T->lchild) + LeafCount(T->rchild);
}

🎊完整代码 

#include<iostream>
using namespace std;
typedef struct BiNode{				
	char data;
	struct BiNode *lchild,*rchild;
}BiTNode,*BiTree;


void CreateBiTree(BiTree &T){	
	
	char ch;
	cin >> ch;
	if(ch=='#')  T=NULL;			
	else{							
		T=new BiTNode;
		T->data=ch;					//生成根结点
		CreateBiTree(T->lchild);	//递归创建左子树
		CreateBiTree(T->rchild);	//递归创建右子树
	}								
}									


void PreOrderTraverse(BiTree T)
{  
   if (T) {
      cout<<T->data;            // 访问结点
      PreOrderTraverse(T->lchild); // 遍历左子树
      PreOrderTraverse(T->rchild);// 遍历右子树  
   }
}



void InOrderTraverse(BiTree T){  
	
	if(T){
		InOrderTraverse(T->lchild);
		cout << T->data;
		InOrderTraverse(T->rchild);
	}
}


void PostOrderTraverse(BiTree T)
{ 
   if (T) {
      PostOrderTraverse(T->lchild); // 遍历左子树
      PostOrderTraverse(T->rchild);// 遍历右子树
      cout << T->data;           // 访问结点
    }
}



int NodeCount(BiTree T)
{
     if(T==NULL) return 0;  			// 如果是空树,则结点个数为0,递归结束
     else return NodeCount(T->lchild)+ NodeCount(T->rchild) +1;
     //否则结点个数为左子树的结点个数+右子树的结点个数+1
     
     //+1,所以可以计算出来//
} 


//计算二叉树中叶子结点的个数
int LeafCount(BiTree T){
 	if(T==NULL) 	//如果是空树返回0
		return 0;
	if (T->lchild == NULL && T->rchild == NULL)
		return 1; //如果是叶子结点返回1
		
		// 1,所以可以计算出来
		
	else return LeafCount(T->lchild) + LeafCount(T->rchild);
}


//计算二叉树的深度	
int Depth(BiTree T)
{ 
	int m,n;
	if(T == NULL ) return 0;        //如果是空树,深度为0,递归结束
	else 
	{							
		m=Depth(T->lchild);			//递归计算左子树的深度记为m
		n=Depth(T->rchild);			//递归计算右子树的深度记为n
		if(m>n) return(m+1);		//二叉树的深度为m 与n的较大者加1
		else return (n+1);
		//+1,所以可以计算出来
	}
}

int main(){
	BiTree tree;
	int nodecount=0,leafcount=0,depth=0;
	cout<<"请输入建立二叉链表的序列:\n";
	CreateBiTree(tree);
	cout<<endl;
	cout<<"先序遍历的结果为:\n";
	PreOrderTraverse(tree);
	cout<<endl;
	cout<<"中序遍历的结果为:\n";
	InOrderTraverse(tree);
	cout<<endl;
	cout<<"后序遍历的结果为:\n";
	PostOrderTraverse(tree);
	cout<<endl;
	cout<<"该二叉树中结点总数为:";
	cout<<NodeCount(tree)<<endl;
	cout<<"该二叉树中叶子结点总数为:";
	cout<<LeafCount(tree)<<endl;
	cout<<"该二叉树的深度为:";
	cout<<Depth(tree)<<endl;
	return 0;
}

🥰如果大家有不明白的地方,或者文章有问题,欢迎大家在评论区讨论,指正🥰 

 

到了这里,关于【数据结构】树,二叉树,满二叉树,完全二叉树的定义和二叉树的基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 初阶数据结构之---二叉树链式结构(二叉树的构建,二叉树的前序,中序,后序和层序遍历,计算二叉树结点个数,第k层结点个数,叶子结点个数,判断是否为完全二叉树)

    本篇博客是初阶数据结构树的收尾,将会讲掉 基本二叉树链式结构的具体内容和实现,包括二叉树的构建,前序遍历,中序遍历,后序遍历和层序遍历,计算二叉树结点个数,第k层结点个数,二叉树叶子结点个数,以及判断一个二叉树是否为完全二叉树 。话不多说,开始我

    2024年03月24日
    浏览(50)
  • 【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法

    💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃 个人主页 :阿然成长日记 👈点击可跳转 📆 个人专栏: 🔹数据结构与算法🔹C语言进阶 🚩 不能则学,不知则问,耻于问人,决无长进 🍭 🍯 🍎 🍏 🍊 🍋 🍒 🍇 🍉 🍓 🍑 🍈 🍌 🍐 🍍 每一个节点有 1.数据

    2024年02月07日
    浏览(44)
  • 【数据结构】树、二叉树的概念和二叉树的顺序结构及实现

    之前我们学习了顺序表、链表以及栈和队列这些数据结构,但这些数据结构都是线性的(一对一)。接下来要学习 非线性的数据结构——树(二叉树) ,相比前面的,树的结构更加复杂,话不多说,直接进入正题吧。 树是一种 非线性的数据结构 ,它是 一对多(也有可能是

    2024年02月07日
    浏览(41)
  • 数据结构——二叉树的链式结构

      个人主页 : 日刷百题 系列专栏 : 〖C语言小游戏〗〖Linux〗〖数据结构〗  〖C语言〗 🌎 欢迎各位 → 点赞 👍+ 收藏 ⭐️+ 留言 📝  ​ 这里我们使用先序遍历的思想来创建二叉树,这里的内容对于刚接触二叉树的朋友可能有些难理解,不妨先看完下面的二叉树各种遍历

    2024年02月05日
    浏览(47)
  • 【数据结构】二叉树的链式结构

    学习链式二叉树要知道三种遍历方式,便于对二叉树的节点以及左子树和右子树进行操作。 前序遍历:根、左子树、右子树 中序遍历:左子树、根、右子树 后序遍历:左子树、右子树、根 以下图为例: 得到的结果: 前序遍历:1 2 3 4 5 6 中序遍历:3 2 1 5 4 6 后序遍历:3 2

    2024年02月08日
    浏览(56)
  • 数据结构:二叉树的链式结构

    朋友们、伙计们,我们又见面了,本期来给大家解读一下链式二叉树的相关知识点,如果看完之后对你有一定的启发,那么请留下你的三连,祝大家心想事成! 数据结构与算法专栏 :数据结构与算法 个  人  主  页 :stackY、 C 语 言 专 栏 :C语言:从入门到精通 目录 前言

    2024年02月07日
    浏览(58)
  • 【数据结构】二叉树的介绍和二叉树堆

    💓作者简介: 加油,旭杏,目前大二,正在学习 C++ , 数据结构 等👀 💓作者主页:加油,旭杏的主页👀 ⏩本文收录在:再识C进阶的专栏👀 🚚代码仓库:旭日东升 1👀 🌹欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖        树这一概念,在我们刚开始听说的时候会觉得

    2024年01月20日
    浏览(52)
  • 【数据结构】二叉树的链式存储结构

    前序遍历,又叫先根遍历。 遍历顺序:根 - 左子树 - 右子树 代码: 中序遍历,又叫中根遍历。 遍历顺序:左子树 - 根 - 右子树 代码 : 后序遍历,又叫后根遍历。 遍历顺序:左子树 - 右子树 - 根 代码 : 除了先序遍历、中序遍历、后序遍历外,还可以对二叉树进行层序遍

    2024年02月09日
    浏览(45)
  • 【数据结构】二叉树的概念及结构

    🚀write in front🚀 📜所属专栏: 初阶数据结构 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励和支持!!! 关注我,关注我,关注我 , 你们将会看到更多的优质内容!! 树是一种 非线性的数据结构

    2023年04月23日
    浏览(43)
  • 【数据结构】二叉树的顺序结构-堆

    普通的二叉树是不适合用数组来存储的,因为可能会存在大量的空间浪费。而 完全二叉树 更适合使用顺序结构存储。 现实中我们通常把堆(一种二叉树)使用顺序结构的数组来存储,需要注意的是这里的堆和操作系统虚拟进程地址空间中的堆是两回事,一个是数据结构,一个

    2024年02月09日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包