- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验第二次
实验-第二次作业
实验题目
编写一个完整的程序,实现二叉树的构造及中序线索化算法,并在主函数中举出应用实例.
2.需求分析
【1】.程序的功能:按照主函数中的策略创建一棵二叉树,接着将该树实现线索化,然后按照中序遍历的遍历方式将二叉树线索化
【2】.输入输出要求:将二叉树的节点值按照一定的顺序进行输入,最终程序按照中序遍历的方式将二叉树的节点值进行输出,在本题中节点元素数组设为是按照5,6,4,8,2,3,7,1,9顺序进行输入的。即:已知二叉树结点值输入的数据顺序是5,6,4,8,2,3,7,1,9;按照以下策略创建二叉树并将其线索化,然后按照中序遍历的方式进行输出。
二叉树的创建策略是:
【1.1】将第一个要创建的元素插入成为根节点。将元素值与结点值比较,如果元素值大于结点值,将此元素送往结点的右儿子结点,如果右儿子结点不是空的,需要重复比较,否则创建结点将元素值插入。
【1.2】如果元素值小于结点值,将此元素送往结点的左儿子结点,如果左儿子结点不是空的,需要重复比较,否则创建结点将此元素值插入。
算法思想:
要实现本题的要求,首先要创建一棵二叉树,该二叉树的创建策略其实就是搜索二叉树的创建原则,当数组元素大于节点元素时,则数组元素应插在当前节点的右分支上,若当前节点的右儿子为空,直接插入,否则一次依次往下比较;当数组元素小于当前节点元素时,应当将其插在当前节点的左分支上,若当前节点的左儿子为空,则直接插入,否则依次比较下去直至找到插入的位置。
在创建好二叉树以后,便要对二叉树进行线索化,根据二叉树线索化的思想,在中序线索化的过程中,对于内节点,其前驱节点是其左子树的最右结点,其后继结点是右子树的最左节点;对于叶子节点,最左儿子的前驱为空,而最右叶子节点的后继结点为空。
线索化以后,则需对其进行中序遍历,然后对其进行输出即可。
5.数据结构
typedef struct node /*结点结构体*/
{ TreeNode left;/*左指针变量*/
int ltag;/*左线索变量*/
int num;/*节点元素*/
int rtag;/*右线索变量*/
TreeNode right;/*右指针变量*/
}Node
6. 模块化
创建一个新的二叉树节点NewNode()
创建一个大小为size空堆栈StackInit(int size)
节点出栈Pop(),入栈操作Push()
创建一棵二叉树CreatTree(int data[],int n,Tree T)
二叉树线索化thread(Tree T)
二叉树的中序遍历Inorder(Tree T)
程序流程图:
8. 源程序
#includestdio.h
typedef struct node*TreeNode;
typedef struct node /*结点结构体*/
{ TreeNode left;/*左指针变量*/
int ltag;/*左线索变量*/
int num;/*节点元素*/
int rtag;/*右线索变量*/
TreeNode right;/*右指针变量*/
}Node;
typedef struct astack*Stack;
typedef struct astack /*堆栈结构体,用数组实现的*/
{ int top;
int maxtop;
TreeNode *data;
}Astack;
typedef struct llist*Tree;
typedef struct llist/*二叉树结构体*/
{ TreeNode boot;
}Llist;
/* 创建一个新的二叉树节点 */
TreeNode NewNode()
{ TreeNode p=(TreeNode)malloc(sizeof(Node));
p-left=p-right=NULL;
p-ltag=p-num=p-rtag=0;
return p;
}
/* 创建一个大小为size的堆栈 */
Stack StackInit(int size)
{ Stack S=(Stack)malloc(sizeof*S);
S-data=(TreeNode)malloc(size*sizeof(TreeNode));/*为数组data分配内存空间S-maxtop=size;
S-top=-1;
return S;
}/*入栈操作 */
void Push(
文档评论(0)