第五章 树与二叉树
在本专栏中,我将于大家分享树与二叉树的知识.
好梦成真Kevin
Never ever give up.
展开
-
(※)中序遍历二叉树的非递归算法
在此之前,我们已经学习了中序遍历二叉树的递归算法,相信大家已经将其牢牢掌握了. 除了使用递归思想作为求解问题的钥匙,还可以借助栈来以非递归方式实现该问题的求解. 首先,我们要讨论存储二叉树结点信息的栈的形态:是只存储二叉树结点的指针,还是要完整存储二叉树结点的信息(LChild指针+数据域data+RChild指针). 在这里先和大家说明,经过程...原创 2020-05-06 17:31:32 · 4431 阅读 · 2 评论 -
普通二叉树的复制问题及对二叉树创建序列的讨论
前面已经和大家分享了一些普通二叉树的操作算法,这里再补充一个比较重要的算法(课本上出现)——普通二叉树的复制. 大家想一下,复制一棵二叉树,其实可以等价为两大操作:①复制二叉树的形态(各结点的关联关系,即指针指向关系),②复制二叉树各结点数据域中的数据. 复制二叉树的形态是本问题的关键. 我们回忆一下当初以先序序列创建二叉树的算法,再与这里的实际...原创 2020-05-06 12:27:23 · 422 阅读 · 0 评论 -
先序遍历线索二叉树
前面已经和大家介绍过"给线索二叉树加先序线索"的操作,这里我们再来讨论先序遍历线索二叉树的操作. 我们先来讨论该如何找到二叉树T中某结点的先序后继:根据先序遍历"根左右"的遍历顺序,如果该结点有左孩子,那么该结点的先序后继就是该结点的左孩子;如果该结点无左孩子且有右孩子,那么该结点的先序后继就是该结点的右孩子;如果该结点既无左孩子又无右孩子,那么该结点的先序后继为...原创 2020-05-05 10:19:39 · 4401 阅读 · 0 评论 -
(※)中序遍历线索二叉树和逆中序遍历线索二叉树
在前面的博客中, 我们已经学习了给二叉树加中序线索的方法. 接下来我们来学习中序遍历线索二叉树的方法. 首先, 我们需要找到二叉树T中第一个被中序遍历的结点: 根据中序遍历的算法逻辑, (※)也就是找到二叉树T的最左下结点. 下面的算法可定位到二叉树的最左下结点.BiTreeNode* FirstNode(BiTreeNode* T)//在以T为根的子树中,...原创 2020-05-05 09:45:38 · 2198 阅读 · 0 评论 -
(※)给线索二叉树加线索
博客更新至此,已基本完成对普通二叉树操作的学习. 下面我即将和大家分享"线索二叉树"的相关知识:还未完全掌握普通二叉树操作的朋友,建议先回过头去仔细复习,待基本掌握普通二叉树的操作后,再阅读本篇博文. 好的,下面我们开始对线索二叉树相关知识的学习. 假设一棵二叉树共有n(n≥1)个结点,那么这棵树中共有2*n=2n个指针域(每个...原创 2020-05-02 12:48:01 · 774 阅读 · 1 评论 -
交换二叉树中每个结点的左孩子和右孩子
在之前的博客中,我们已经掌握了二叉树先序遍历、中序遍历和后序遍历递归算法. 我们可以任选一种遍历序列作为本算法的基础,并在遍历结点时交换该结点的左右子树顺序即可. 在此,我选择先序遍历序列. 遍历序列的选择仅仅是"开胃菜",解决本问题的核心是"如何交换某结点的左右子树顺序":大家可以在草稿纸上画出一棵形态具有代表性(即不能过...原创 2020-05-02 11:31:24 · 17949 阅读 · 3 评论 -
用层次遍历二叉树的方法统计二叉树中度为1的结点的个数
在之前的博客中,我们已经掌握了使用辅助队列来实现二叉树层次遍历的算法. 既然是"遍历",那么二叉树中的每个结点在一次操作中都会被访问到:基于此,我们对遍历时的操作稍加修改,便可统计二叉树中度为1的结点的个数. (※)这里再说明一下判断结点度是否为1的方法:如果某结点的左孩子为空且右孩子不空或左孩子不空且右孩子为空,那么该结点的度就为1. 根据分...原创 2020-05-02 11:05:57 · 10440 阅读 · 1 评论 -
如何层次遍历二叉树(使用队列作为辅助工具)
在此之前,我们已经掌握了使用递归算法实现二叉树先序遍历、中序遍历和后序遍历的流程,这里我们加大一下难度,探讨该如何实现二叉树的层次遍历算法. 相信有朋友至此会直接回答"用递归算法解决". 我曾经也有过这种想法,可后来的实践证明,"用递归思想设计层次遍历算法"这种想法是不可行的:和之前提到的三种遍历过程不同的是,在二叉树的层次遍历过程中,对于各结点的操作并不能总结出...原创 2020-05-01 10:32:33 · 2035 阅读 · 0 评论 -
二叉树基本操作补充(求二叉树中度为0/度为1/度为2的结点个数)
在掌握了二叉树的先序遍历递归算法、中序遍历递归算法和后序遍历递归算法的实现流程后,我们稍微开拓一下视野,来看一下该如何求出二叉树中度为0、度为1和度为2的结点的个数. 在设计算法之前,我们要弄清什么是"结点的度". "结点的度"是指该结点孩子的个数:如果该结点没有孩子,那么该结点的度为0;如果该结点只有左孩子而没有右孩子或只有右孩子而没有左孩子,那么该结点的度为1...原创 2020-05-01 09:30:25 · 4816 阅读 · 1 评论 -
二叉树的基本操作(先序序列创建二叉树/先序遍历递归算法/中序遍历递归算法/后序遍历递归算法/求二叉树深度的递归算法)
二叉树的存储结构有顺序存储和链式存储两种存储方式,这里我们采用使用频率较高的链式存储方式(二叉链表)来存储二叉树. 下面给出二叉树结点的定义.struct BiTreeNode//二叉树结点定义{ BiTreeNode* LChild;//左孩子指针域 int data; BiTreeNode* RChild;//右孩子指针域}; ...原创 2020-05-01 09:14:02 · 4635 阅读 · 0 评论