返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++链式二叉树深入分析
  • 709
分享到

C++链式二叉树深入分析

2024-04-02 19:04:59 709人浏览 泡泡鱼
摘要

目录二叉树的结构和概念二叉树的操作前序遍历中序遍历和后序遍历二叉树的节点个数求二叉树叶子结点个数求二叉树的深度在二叉树查找为X的结点之前我们的重点学习二叉树都是完全二叉树,接下来我们

之前我们的重点学习二叉树都是完全二叉树,接下来我们来说下普通二叉树,普通的二叉树如果我们使用数组存储,那么会浪费相当多的空间的,所以我们选择链表存储,我们先再来复习下二叉树的结构吧。

二叉树的结构和概念

二叉树概念是:

1. 空树

2. 非空:根节点,根节点的左子树、根节点的右子树组成的。

从概念中可以看出,二叉树定义是递归式的。

我们就手动创建一个二叉树,用于学习二叉树的访问吧,结构如下:

typedef int BTDataType;
typedef struct BinaryTreenode
{
	BTDataType data;
	struct BinaryTreeNode* left;
	struct BinaryTreeNode* right;
}BTNode;
BTNode* BuyNode(BTDataType* x)
{
	BTNode* NewNode = (BTNode*)malloc(sizeof(BTNode));
	assert(NewNode);
	NewNode->data = x;
	NewNode->left = NULL;
	NewNode->right = NULL;
	return NewNode;
}
BTNode* CreatBinaryTree()
{
	BTNode* node1 = BuyNode(1);
	BTNode* node2 = BuyNode(2);
	BTNode* node3 = BuyNode(3);
	BTNode* node4 = BuyNode(4);
	BTNode* node5 = BuyNode(5);
	BTNode* node6 = BuyNode(6);
	node1->left = node2;
	node1->right = node4;
	node2->left = node3;
	node4->left = node5;
	node4->right = node6;
	return node1;
}

我们可以根据上述的结构进行二叉树的后续操作啦。

二叉树的操作

学习二叉树结构,最简单的方式就是遍历。

所谓二叉树遍历(Traversal)是按照某种特定的规则,依次对二叉 树中的节点进行相应的操作,并且每个节点只操作一次。访问结点所做的操作依赖于具体的应用问题。 遍历 是二叉树上最重要的运算之一,也是二叉树上进行其它运算的基础。

按照规则,二叉树的遍历有:前序/中序/后序的递归结构遍历:

1. 前序遍历(Preorder Traversal )——访问根结点的操作发生在遍历其左右子树之前。

2. 中序遍历(Inorder Traversal)——访问根结点的操作发生在遍历其左右子树之中(间)。

3. 后序遍历(Postorder Traversal)——访问根结点的操作发生在遍历其左右子树之后。

由于被访问的结点必是某子树的根,所以N(Node)、L(Left subtree)和R(Right subtree)又可解释为 根、根的左子树和根的右子树。NLR、LNR和LRN分别又称为先根遍历、中根遍历和后根遍历。

前序遍历

我们都知道二叉树我们可以分为 根 左子树 右子树,这三个部分,我们先序遍历,就是先访问二叉树的根,在访问左子树,最后访问右子树,如果访问到空树我们使用 ‘*’ 代替,我们用代码控制下:

我们自己创建的二叉树的图如下:

void Preorder(BTNode* root)
{
	if (root == NULL)
	{
		printf("* ");//空树打印 * 
		return ;
	}
	printf("%d ", root->data);//先访问 根
	Preorder(root->left);//再访问左子树
	Preorder(root->right);//最后访问右子树
}

中序遍历和后序遍历

这两个遍历和上面对比就是把访问根的顺序变了,不在详细说了。

void Inorder(BTNode* root)//中序遍历
{
	if (root == NULL)
	{
		printf("* ");//空树打印 * 
		return;
	}
	Preorder(root->left);//先访问左子树
	printf("%d ", root->data);//再访问 根
	Preorder(root->right);//最后访问右子树
}
void Postorder(BTNode* root)//后序遍历
{
	if (root == NULL)
	{
		printf("* ");//空树打印 * 
		return;
	}
	Preorder(root->left);//先访问左子树
	Preorder(root->right);//再访问右子树
	printf("%d ", root->data);//最后访问 根
}

二叉树的节点个数

我们接下来要求出二叉树的节点个数。

1. 我们使用计数器进行操作。缺点:每次使用前全局变量要置为0,比较麻烦。

2. 我们使用分治的思路,转化为这个根+左子树的节点+右子树的节点

我们来一个个实现吧。

思路一:(不常用)

我们定义一个全局变量size,使用前序遍历,然后把其中打印部分去掉换成 ++size即可,我们要在每次使用该函数时,手动把我们定义的全局变量置为0。

int size;
void TreeSize(BTNode* root)
{
	if (root == NULL)
	{
		return;
	}
	size++;//计数器
	TreeSize(root->left);//访问左子树
	TreeSize(root->right);//访问右子树
}
int main()
{
	BTNode* root = CreatBinaryTree();
	size = 0;
	TreeSize(root);
	printf("TreeSize = %d\n", size);
	return 0;
}

思路二:

我们可以使用分治的思想转化为 求该节点的左子树+右子数+根,如果为NULL,就返回0.

int TreeSize2(BTNode* root)
{
	if (root == NULL)//为NULL返回0
	{
		return 0;
	}
	return TreeSize2(root->left) + TreeSize2(root->right) + 1;
}

求二叉树叶子结点个数

要求叶子结点,就是左右的子树都是空树,才是一个叶子节点,我们可以转化为求左子树的叶子+右子树的叶子。

int TreeLeafSize(BTNode* root)//求叶子节点
{
	if (root == NULL)//空树返回0
	{
		return 0;
	}
	if (root->left == NULL && root->right == NULL)//左子树为空并且右子树为空返回1
	{
		return 1;
	}
	return TreeLeafSize(root->left) + TreeLeafSize(root->right);
}

求二叉树的深度

我们还是采用分治的思想,我们先求出左子树的高度,再求出右子树的高度,进行对比,比较时不要忘了自身也是有高度的,最后把二叉树拆到最小的空树时返回0就好啦。

int TreeDepth(BTNode* root)
{
	if (root == NULL)//空树返回0
	{
		return 0;
	}
	int Leftdepth = TreeDepth(root->left);//求出左边高度
	int Rightdepth = TreeDepth(root->right);//求出右边高度
	return Leftdepth > Rightdepth ? Leftdepth + 1 : Rightdepth + 1;//返回时加上自身返回
}

在二叉树查找为X的结点

我们在二叉树中查找结点,可以使用前序遍历,找到该节点时我们直接返回不用在查找。整体上采用前序遍历,我们需要注意,在遍历左右子树时,我们应该保存节点的值方便返回。

BTNode* TreeFind(BTNode* root, BTDataType x)//查找二叉树中值为x的节点
{
	if (root == NULL)//为空返回空
	{
		return NULL;
	}
	if (root->data == x)//相等就返回节点
	{
		return root;
	}
	BTNode* RetLeft = TreeFind(root->left, x);//保存左节点值,方便直接返回
	if (RetLeft)
	{
		return RetLeft;
	}
	BTNode* RetRight = TreeFind(root->right, x);//保存右节点值,方便直接返回
	if (RetRight)
	{
		return RetRight;
	}
	return NULL;//都找不到返回NULL
}

到此这篇关于c++链式二叉树深入分析的文章就介绍到这了,更多相关C++链式二叉树内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: C++链式二叉树深入分析

本文链接: https://lsjlt.com/news/150739.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • C++链式二叉树深入分析
    目录二叉树的结构和概念二叉树的操作前序遍历中序遍历和后序遍历二叉树的节点个数求二叉树叶子结点个数求二叉树的深度在二叉树查找为X的结点之前我们的重点学习二叉树都是完全二叉树,接下来我们...
    99+
    2024-04-02
  • C语言深入浅出解析二叉树
    目录树概念及结构相关概念树的表示树在实际中的运用(表示文件系统的目录树结构)二叉树概念及结构概念需要注意的特殊二叉树二叉树的性质二叉树的存储结构顺序存储链式存储总结树概念及结构 树是...
    99+
    2024-04-02
  • Java深入分析了解平衡二叉树
    目录AVL树的引入基本概念基础设计RR(左旋)LL(右旋)LR(先左旋再右旋)RL(先右旋再左旋)添加节点删除节点AVL树的引入 搜索二叉树有着极高的搜索效率,但是搜索二叉树会出现以...
    99+
    2024-04-02
  • C++如何建立链式二叉树
    本篇内容介绍了“C++如何建立链式二叉树”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!递归建立二叉树二叉树的结构体typedef ...
    99+
    2023-07-02
  • C++AVLTree高度平衡的二叉搜索树深入分析
    目录一、AVL树的概念二、AVL树节点的定义三、AVL树的插入四、AVL树的旋转1.左单旋2.右单旋3.左右双旋4.右左双旋五、进行验证六、AVLTree的性能一、AVL树的概念 二...
    99+
    2023-03-08
    C++ AVLTree二叉搜索树 C++高度平衡二叉搜索树
  • C++树与二叉树实例分析
    这篇“C++树与二叉树实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++树与二叉树实例分析”文章吧。树树的定义Q:...
    99+
    2023-06-30
  • C++深入细致探究二叉搜索树
    目录1、二叉搜索树的概念2、二叉搜索树的操作二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除3、二叉搜索树的实现4、二叉搜索树的性能分析1、二叉搜索树的概念  二叉搜索树又...
    99+
    2024-04-02
  • 深入探究C语言中的二叉树
    目录1.树概念及结构1.1树的概念 1.2 树的相关概念1.3 树的表示2.二叉树概念及结构   2.1概念2.2 特殊的二叉树2.3 二叉树的性质&n...
    99+
    2023-05-19
    C语言二叉树 C语言数据结构
  • C++二叉搜索树实例分析
    本篇内容介绍了“C++二叉搜索树实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!独一无二的二叉搜索树Given an integer&...
    99+
    2023-06-19
  • C++如何实现二叉树链表
    目录C++二叉树链表C++二叉树转链表C++二叉树链表 Node.h #ifndef NODE_H #define NODE_H #include <iostream> ...
    99+
    2024-04-02
  • C语言 链式二叉树结构详解原理
    目录前言二叉树节点声明二叉树的遍历构建二叉树1.前序遍历2.中序遍历3.后序遍历二叉树节点的个数二叉树叶子节点的个数二叉树第K层节点个数二叉树的高度/深度二叉树查找值为x的节点整体代...
    99+
    2024-04-02
  • C++二叉树层序遍历实例分析
    今天小编给大家分享一下C++二叉树层序遍历实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。二叉树层序遍历Example...
    99+
    2023-06-19
  • C语言中二叉树的示例分析
    这篇文章主要为大家展示了“C语言中二叉树的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C语言中二叉树的示例分析”这篇文章吧。树概念及结构树是一种 非线性 的数据结构,它是由 n ( n...
    99+
    2023-06-29
  • Java中二叉树与N叉树的示例分析
    这篇文章主要介绍了Java中二叉树与N叉树的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。题目一 解法class Solution {&...
    99+
    2023-06-29
  • C语言数据结构之二叉链表创建二叉树
    目录一、思想(先序思想创建)二、创建二叉树(1)传一级参数方法(2)传二级参数方法一、思想(先序思想创建) 第一步先创建根节点,然后创建根节点左子树,开始递归创建左子树,直到递归创建...
    99+
    2024-04-02
  • C++简单又轻松建立链式二叉树流程
    目录递归建立二叉树二叉树的结构体二叉树初始化先序遍历中序遍历后序遍历具体例题输入的格式全部源码总结递归建立二叉树 二叉树的结构体 typedef struct Node { int...
    99+
    2024-04-02
  • C语言链式二叉树结构原理是什么
    这篇文章主要介绍“C语言链式二叉树结构原理是什么”,在日常操作中,相信很多人在C语言链式二叉树结构原理是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C语言链式二叉树结构原理是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-25
  • C语言平衡二叉树的示例分析
    这篇文章给大家分享的是有关C语言平衡二叉树的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。平衡二叉树(Balanced Binary Tree)又被称为AVL树(有别于AVL算法),且具有以下性质:它是一...
    99+
    2023-06-25
  • 数据结构之链式二叉树详解
    目录🍏1.二叉树的遍历🍏1.1前序遍历1.2中序遍历1.3后序遍历1.4层次遍历 🍎2.链式二叉树的实现🍎2.1二叉树的创建2.2前序遍历2.3中序遍历2.4后序遍历2.5...
    99+
    2023-05-16
    C语言链式二叉树 数据结构链式二叉树 C语言 数据结构
  • C++怎么求二叉树的最小深度
    本篇内容介绍了“C++怎么求二叉树的最小深度”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!二叉树的最小深度Given a binary tr...
    99+
    2023-06-20
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作