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

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

🎊专栏【数据结构】

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

🎆音乐分享【勋章】

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

目录

⭐树

🏳️‍🌈定义

 🏳️‍🌈注意

🍔树的基本术语

⭐二叉树

🏳️‍🌈定义

🎆二叉树和树的区别

🏳️‍🌈二叉树的性质

⭐满二叉树

⭐完全二叉树

🎁遍历二叉树

🎈先序遍历二叉树

🎈中序遍历二叉树

🎈后序遍历二叉树

🎁构建二叉树

🎈算法步骤

🎈代码

🎁复制二叉树

🎈算法步骤

🎈代码

🎁计算二叉树的深度

🎈算法步骤

🎈代码

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

🎈算法步骤

🎈代码

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

🎈算法步骤

🎈代码

🎊完整代码 


 文章来源地址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日
    浏览(25)
  • 【数据结构】二叉树的节点数,叶子数,第K层节点数,高度,查找x节点,判断是否为完全二叉树等方法

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

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

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

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

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

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

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

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

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

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

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

    2024年01月20日
    浏览(29)
  • 【数据结构 —— 二叉树的链式结构实现】

    树是一种非线性的数据结构,它是由n(n=0)个有限结点组成一个具有层次关系的集合。 把它叫做树是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。 1.有一个 特殊的结点,称为根结点 ,根节点没有前驱结点 2.除根节点外, 其余结点被分成M(M0)个互不相交

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

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一、二叉树的存储结构 二、二叉树链式结构的实现 2.1手动构建一课树 2.2二叉树的遍历 三、二叉树链式结构的实现 3.1前序遍历(递归) 3.2中序遍历(递归) 3.3后序遍历(递归) 3.4层序遍历(非递

    2024年02月03日
    浏览(32)
  • 【数据结构】二叉树的链式存储结构

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

    2024年02月09日
    浏览(17)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包