目录
前言
树的概念,树的表示方法,树的遍历方法,树的存储
一 树的表现形式
1 父子节点表示法
这个是我们最常用的方法,每一棵树的根叫作根r的儿子,而r是每一棵子树的根的父亲
这个是我们日常里面最常用的方法,但是当我们不知道我们要连接多少个节点的时候,这个时候就有了另外一种表示方法,就是兄弟儿子表示法
二 兄弟儿子表示法
就比如下面这种,我不知道要连接多少个节点的时候,我们的结构体要怎么进行定义呢?有的人肯定会说定义一个结构体数组呗,但是如果定义了1w,我有10w呢?又或者说我就只有6个,那岂不是很浪费时间,这个时候就要引入我们的兄弟儿子表示法
我们给树进行标号
然后这个时候我们就用兄弟表示法
我们利用了兄弟表示法,这个时候你发现其实这个就是一个二叉树,很巧妙,但是我们的结构体要怎么定义呢?
struct TreeNode{ int data; struct TreeNode* son; struct TreeNode* bro; };
一个是用来指向儿子的,一个是用来指向兄弟的
这是两个树里面常见的表示方法
二 树的基本概念
1 一棵树是有N个节点和N-1条边组成的
2 没有儿子的节点称作叶子节点 son
3 具有相同父亲的节点称作为兄弟节点 bro
4 路径:从A到L的路径上经过的节点的序号叫做路径,如:A B C D E F G H Y J K L,这样就是路径
5 路径的长:从A到L的边的个数有多少个,如11个,这就是路径的长
6 深度和高其实差不多,不需要细纠,深就是从子叶到根,高就是该节点到叶子节点7 度为0的节点是叶子节点,即没有子节点的节点。
度为1的节点有一个子节点。
度为2的节点有两个子节点。
三 树的存储方法
一 数组存储
这个一般是存储完全二叉树比较有用
我们可以看到每一个父节点的子节点,都是左节点是父节点的序号乘以2,右节点是父节点的序号乘以2+1,上面这个是完全二叉树,但是如果不是完全二叉树的画就会浪费大量的空间
二 链表存储
这个就是很简单了,这里就不说了
四 树的遍历
遍历的方法:前序遍历,中序遍历,后序遍历
先序遍历(Pre-order Traversal):
先序遍历的顺序是:根节点 -> 左子树 -> 右子树
具体步骤是:首先访问根节点,然后递归地先序遍历左子树,最后递归地先序遍历右子树
中序遍历(In-order Traversal):
中序遍历的顺序是:左子树 -> 根节点 -> 右子树
具体步骤是:首先递归地中序遍历左子树,然后访问根节点,最后递归地中序遍历右子树
后序遍历(Post-order Traversal):
后序遍历的顺序是:左子树 -> 右子树 -> 根节点
具体步骤是:首先递归地后序遍历左子树,然后递归地后序遍历右子树,最后访问根节点
总结
我们学习树的表示方法,树的概念,树的存储,树的遍历方法