【算法总结】二叉树(王道机试指南第三章)
2020-12-13 03:11
标签:com 树根 教科书 src 堆栈 重点 长度 %s width 我们从二叉树的遍历谈起。 众所周知,在对二叉树的遍历过程中,根据遍历每一个结点的左子树、结点本身、右子树的顺序不同可将对二叉树的遍历方法分为前序遍历、中序遍历、后序遍历。我们摒弃数据结构教科书上复杂的遍历方式,而是使用我们在上一章所重点讨论过的递归程序来简单的实现它。 假设二叉树结点由以下结构体表示: 我们以中序遍历为例,给出其遍历方法。 如上所见,用递归方式编写的二叉树遍历代码较原始使用堆栈来编写的相同功能代码,在代码量上得到巨大的优化。为了完成对二叉树的中序遍历,在遍历任意一个结点 Tree 时,我们首先递归遍历其左儿子及其子树,再遍历该结点本身,最后遍历其右儿子及其子树,从而完成对二叉树的中序遍历。 相同的,若我们需要其他两种形式的遍历方式,只需简单的修改遍历自身结点和递归遍历左右儿子的相关语句顺序即可。 例 3.4 二叉树遍历 解题思路: 该例题涉及二叉树的建立、由二叉树的两种遍历结果还原二叉树、二叉树的遍历等多种知识点。我们以分析该例题为例,介绍关于二叉树各知识点。 由该例要求,首先我们需要根据给定的二叉树前序和中序遍历结果还原该二叉树。其次,我们需要将还原的二叉树以二叉树的形式保存在内存中。最后,我们需要对建立的二叉树进行后序遍历。 后序遍历在前文中已经有所提及。下面我们对前两部分做重点的阐述。 由给定的前序和中序遍历还原得到该二叉树。以前序遍历结果 XDAGFE, 和中序遍历结果 ADGXFE 为例详细讨论其还原方法。 由前序遍历结果的首个元素为 X 可知,原树必是由 X 为根结点。在中序遍历中,遍历结果 ADGXFE 以 X 为界分为两个子串。其中第一个子串 ADG 为 X 的左子树的中序遍历结果,第二个子串 FE 为 X 的右子树的中序遍历结果。这样我们知道 X 的左子树具有 3 个元素,X 的右子树具有 2 个元素。根据元素的数量我们同样可以得知,在先序遍历中去除根结点 X 后剩余的串 DAGFE 中,前 3 个字符 DAG 为 X 的左子树的前序遍历结果,后 2 个字符 FE 为 X 的右子树的前序遍历结果。 同样的对于确定的左子树前序遍历结果 DAG 和中序遍历结果 ADG 重复以上确定过程,可知 D 为该子树根结点,其左儿子为 A,右儿子为 G。 X 的右子树前序遍历结果 FE 和中序遍历结果 FE 同样可以确定该子树以 F 为根节点,其左儿子不存在,右儿子为 E。 这样我们就还原了原始二叉树。 我们还需将还原出来的树保存在内存中。使用结构体: 表示树的一个结点,其字符信息保存在字符变量 c,若该结点存在左儿子或者右儿子,则指向他们的指针保存在 lchild 或 rchild 中,否则该指针为空。 下面给出本例代码,详细了解其实现。 【算法总结】二叉树(王道机试指南第三章) 标签:com 树根 教科书 src 堆栈 重点 长度 %s width 原文地址:https://www.cnblogs.com/yun-an/p/11070307.htmlstruct Node
{
Node *lchild;//指向其左儿子结点的指针,当其不存在左儿子时为NULL
Node *rchild;//指向其右儿子结点的指针,当其不存在右儿子时为NULL
/*
*
*
其他节点信息的操作*/
} ;
void inOrder(Node *Tree)
{
if(Tree->lchild != NULL)inOrder(Tree->lchild);//递归遍历左子树
/*
*
*
对当前根结点做遍历操作*/
if(Tree->rchild != NULL)inOrder(Tree->rchild);//递归遍历右子树
return;
}
struct Node//树结点结构体
{
Node *lchild;//左儿子指针
Node *rchild;//右儿子指针
char c;//结点字符信息
}Tree[50];//静态内存分配数组
#include