数据结构 树的表示,存储结构与遍历
2017-10-07 13:34
363 查看
查找的概念:
根据某个关键字K,从集合R中找出与关键字K相同的记录
静态查找:集合中的记录是固定的
动态查找:集合中的记录是动态变化的
二分查找树:
判定树上每个结点需要的查找次数刚好为该节点所在的层数
找到所需元素的查找次数不会超过判定树的深度
N个节点的判定树深度为log2n+1
树的定义:
树是N个结点构成的有限集合
当N=0时称为空树,
非空树具有以下特点:
(1)树中有一个称为"ROOT"的特殊节点,用R表示
(2)子树:其余节点可以组成M棵子树
子树是不相交的, 除了根结点外, 每个结点有且仅有一个父结点
一棵N个节点的树 有N-1条边
树的基本用语:
(1)节点的度:节点的子树个数
(2)树的度:树的所有节点中最大的度数
(3)叶节点:度为0的节点
(4)父节点:一个节点上面的节点
(5)子节点:父节点下面的两个子节点
(6)路径长度:从一个节点到另一个节点所经历的节点数就是路径长度
(7)节点的层次:规定根结点层数为1 往下就是层次数加1
(8)树的深度:树中所有节点中的最大层次 就是树的深度
树的表示:
儿子-兄弟表示法
![](https://img-blog.csdn.net/20171007143203349?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxleDE5OTcyMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
第一个指针指向第一个儿子
第二个指针指向兄弟节点
实现结果如下
![](https://img-blog.csdn.net/20171007143744637?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxleDE5OTcyMjI=/font/5a6L5<br/>4000<br/>L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二叉树的定义
![](https://img-blog.csdn.net/20171007144046602?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxleDE5OTcyMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
二叉树是一个有穷的结点集合,这个集合可以为空
若不为空:则它是由根结点和称为其左子树和右子树的两个不相交二叉树构成
完全二叉树:
有n个结点的二叉树,对树中节点按从上至下,从左到右顺序进行编号
编号为i节点与满二叉树中编号为i节点在二叉树中位置相同
二叉树的重要性质:
一个二叉树第I层的最大节点数:2^(I-1)个节点
深度为k的二叉树有最大的总结点数为: 2^k - 1 个节点
对任何非空二叉树T, 叶节点数为N0, 有两个子节点的节点数为N2
则N0 = N2 + 1
二叉树结构:
二叉树的遍历
先序遍历:
(1)访问根节点
(2)先序遍历左子树
(3)先序遍历右子树
遍历顺序如下所示:
![](https://img-blog.csdn.net/20171007154507040?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxleDE5OTcyMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
中序遍历过程:
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
![](https://img-blog.csdn.net/20171007155056188?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxleDE5OTcyMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
后序遍历:
(1)后序遍历其左子树
(2)后序遍历其右子树
(3)遍历根结点
![](https://img-blog.csdn.net/20171007155657911?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYWxleDE5OTcyMjI=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
代码实现:
根据某个关键字K,从集合R中找出与关键字K相同的记录
静态查找:集合中的记录是固定的
动态查找:集合中的记录是动态变化的
二分查找树:
判定树上每个结点需要的查找次数刚好为该节点所在的层数
找到所需元素的查找次数不会超过判定树的深度
N个节点的判定树深度为log2n+1
树的定义:
树是N个结点构成的有限集合
当N=0时称为空树,
非空树具有以下特点:
(1)树中有一个称为"ROOT"的特殊节点,用R表示
(2)子树:其余节点可以组成M棵子树
子树是不相交的, 除了根结点外, 每个结点有且仅有一个父结点
一棵N个节点的树 有N-1条边
树的基本用语:
(1)节点的度:节点的子树个数
(2)树的度:树的所有节点中最大的度数
(3)叶节点:度为0的节点
(4)父节点:一个节点上面的节点
(5)子节点:父节点下面的两个子节点
(6)路径长度:从一个节点到另一个节点所经历的节点数就是路径长度
(7)节点的层次:规定根结点层数为1 往下就是层次数加1
(8)树的深度:树中所有节点中的最大层次 就是树的深度
树的表示:
儿子-兄弟表示法
第一个指针指向第一个儿子
第二个指针指向兄弟节点
实现结果如下
二叉树的定义
二叉树是一个有穷的结点集合,这个集合可以为空
若不为空:则它是由根结点和称为其左子树和右子树的两个不相交二叉树构成
完全二叉树:
有n个结点的二叉树,对树中节点按从上至下,从左到右顺序进行编号
编号为i节点与满二叉树中编号为i节点在二叉树中位置相同
二叉树的重要性质:
一个二叉树第I层的最大节点数:2^(I-1)个节点
深度为k的二叉树有最大的总结点数为: 2^k - 1 个节点
对任何非空二叉树T, 叶节点数为N0, 有两个子节点的节点数为N2
则N0 = N2 + 1
二叉树结构:
class TreeNode { friend class BinaryTree; private: ElementType data; TreeNode* LChild; //指向左子节点 TreeNode* RChild; //指向右子节点 }; class BinaryTree { private: TreeNode* root; public: BinaryTree() { root = NULL; } bool isEmpty(); //判断是否为空 void TravelSal(); //遍历每个节点 BinaryTree CreateBinaryTree(); //创建一棵二叉树
二叉树的遍历
先序遍历:
(1)访问根节点
(2)先序遍历左子树
(3)先序遍历右子树
遍历顺序如下所示:
中序遍历过程:
(1)中序遍历左子树
(2)访问根结点
(3)中序遍历右子树
后序遍历:
(1)后序遍历其左子树
(2)后序遍历其右子树
(3)遍历根结点
代码实现:
//先序遍历 void BinaryTree::preOrderTravelsal(TreeNode* node) { if (node) { cout << node->data << " "; preOrderTravelsal(node->LChild); //往左边遍历 preOrderTravelsal(node->RChild); //往右边遍历 } } //中序遍历 void BinaryTree::midOrderTravelsal(TreeNode* node) { if (node) { midOrderTravelsal(node->LChild) cout << node->data << " "; midOrderTravelsal(node->RChild); //往右边遍历 } } //后序遍历 void BinaryTree::backOrderTravelsal(TreeNode* node) { if (node) { backOrderTravelsal(node->LChild); //往左边遍历 backOrderTravelsal(node->RChild); //往右边遍历 cout << node->data << " "; } }
相关文章推荐
- 数据结构 - 图的存储结构表示及其遍历 (DFS && BFS)
- 数据结构_图_邻接多重表做存储结构遍历无向图_C++实现
- 数据结构之图(存储结构、遍历)
- 数据结构-二叉树的存储结构和遍历算法(四)
- 数据结构-二叉树的存储结构与遍历
- 数据结构:二叉树的遍历和存储结构
- 二叉树的概念,二叉树的数据存储结构,二叉树的性质,二叉树的遍历方法数据结构-树的学习(3)
- 数据结构--图--图的数组存储表示,深度优先搜索遍历和广度优先搜索遍历
- 树的孩子表示法,树的兄弟表示法,树的存储结构详解,数据结构-树的学习(2)
- 【数据结构】线性表的单链表存储结构表示和实现
- 数据结构一一线性表的链式存储结构之插入与遍历
- 10-数据结构_线性结构-离散存储-链表_创建与遍历链表
- 数据结构之通用树(使用链表实现树的存储结构,双亲孩子表示法)
- 【数据结构】算法7.1-7.2 图的存储结构-数组表示法
- 数据结构之图(存储结构、遍历)
- 数据结构第三部分:树与树的表示、二叉树及其遍历、二叉搜索树、平衡二叉树、堆、哈夫曼树、集合及其运算
- 浅谈图的存储结构与遍历
- 二叉树的构建,线索化,以及线索二叉树的遍历c++语言表示(《数据结构》算法6.5,6.6,6.7)
- 数据结构与算法6:二叉树的存储结构与遍历
- 图 - 图的存储结构 - 邻接表表示法