【数据结构 C++】 树详解_c+

  • 森林:由m(m>=0)棵互不相交的树的集合称为森林;
二叉树

二叉树是数据结构中一种重要的数据结构,也是树表家族最为基础的结构。

二叉树的定义:二叉树的每个结点至多只有二棵子树(不存在度大于2的结点),二叉树的子树有左右之分,次序不能颠倒。

⼆叉树的种类

⼆叉树有两种主要的形式:满⼆叉树完全⼆叉树

满二叉树

在一棵二叉树中,如果所有的分支节点都存在左子树和右子树,并且所有叶子都在同一层上,这样的二叉树成为满二叉树。
在这里插入图片描述

完全二叉树

对一棵具有n个结点的二叉树按层序编号,如果编号为 i(1 ≤ i ≤ n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中的位置完全相同,则这棵二叉树称为完全二叉树

在这里插入图片描述

二叉树的性质
  1. 二叉树的第 i 层至多有

2

i

1

{2}^{i-1}

2i−1个结点;
2. 深度为 k 的二叉树至多有

2

k

{2}^{k}

2k-1个结点;
3. 对任何一棵二叉树T,如果其终端结点的个数(也就是叶子节点数)为

n

0

{n}_{0}

n0​,度为2的结点个数为

n

2

{n}_{2}

n2​,则

n

0

{n}_{0}

n0​=

n

2

{n}_{2}

n2​+1。(大话数据结构P143)

二叉树的遍历方法

二叉树的遍历方式主要可以分为四种:前序遍历、中序遍历、后序遍历和层序遍历。

前序遍历

简单记为中左右,也就是说先访问根节点,然后前序遍历左子树,再前序遍历右子树。

在这里插入图片描述
遍历的顺序为ABDGHCEIF

中序遍历

简单记为左中右,也就是说先访问二叉树最左边的结点,然后再访问中间的结点,最后再访问右边的结点。·

在这里插入图片描述
遍历的顺序为GDHBAEICF

后序遍历

简单记为左右中,也就是说先访问二叉树最左边的结点,然后再访问右边的结点,最后再访问中间的结点。·

在这里插入图片描述
遍历的顺序为GHDBIEFCA

层序遍历

从根结点开始访问,从上而下逐层遍历,在同一层中·,按从左到右的顺序对结点逐个访问。

在这里插入图片描述
遍历的顺序为ABCDEFGHI

前序遍历、中序遍历和后序遍历就是中的位置不一样,前序遍历就是中左右,中序遍历就是左中右,后序遍历就是左右中。

前中后序遍历都是深度搜索,层序遍历是广度搜索。

二叉树的实现
⼆叉树的定义
struct TreeNode {
 	int val;
 	TreeNode \*left;
 	TreeNode \*right;
 	TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};

使用前序遍历创建二叉树
void CreatTreeNode(TreeNode\*&T){
    char c;
    cin >> c;
    if(c=='\*'){
        T = NULL;
        return;
    }
    else{     
        T = new TreeNode;
        T->val = c;
        CreatTreeNode(T->left);
        CreatTreeNode(T->right);
    }
}

前序遍历
class Solution {
public:
 	void traversal(TreeNode\* cur, vector<int>& vec) {
 		if (cur == NULL) return;
 	vec.push\_back(cur->val); // 中
 	traversal(cur->left, vec); // 左
 	traversal(cur->right, vec); // 右
 }
 	vector<int> preorderTraversal(TreeNode\* root) {
 		vector<int> result;
 		traversal(root, result);
 		return result;
 }


![img](https://img-blog.csdnimg.cn/img_convert/0b7c28644e1a1d2be4148ac46cb4ca9d.png)
![img](https://img-blog.csdnimg.cn/img_convert/f17af99d9e68472e6a0f63f25f58ad5a.png)

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

转存中...(img-sDZGa4WW-1714175624645)]

**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618545628)**


**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值