存在的问题:若根据先序遍历结果和中序遍历结果无法重建二叉树应该输出NO。但是它还做不到。
代码如下:
#include <stdio.h> #include<iostream> using namespace std; typedef struct ListNode{ int value; struct ListNode* pLeftChild; struct ListNode* pRightChild; }ListNode; void lastSearch(ListNode *pHead) { if(pHead!=NULL) { if(pHead->pLeftChild!=NULL) { lastSearch(pHead->pLeftChild); } if(pHead->pRightChild!=NULL) { lastSearch(pHead->pRightChild); } printf("%c\n",pHead->value); } } //if tag==1:rightChild。 if tag==0:leftChild void reBuild(char* strPre,int preStrLength,char* strMid,int midStrLength,ListNode *node,int tag) { if(preStrLength<1 || midStrLength<1 || node==NULL || strPre==NULL || strMid==NULL || preStrLength!=midStrLength) { return; } int i; char value=*strPre; char *leftNewPreStr=(char *)malloc(preStrLength); char *leftNewMidStr=(char *)malloc(midStrLength); char *leftPre=leftNewPreStr; char *leftMid=leftNewMidStr; char *rightNewPreStr=(char *)malloc(preStrLength); char *rightNewMidStr=(char *)malloc(midStrLength); char *rightPre=rightNewPreStr; char *rightMid=rightNewMidStr; ListNode *newNode=(ListNode *)malloc(sizeof(ListNode)); newNode->value=value; newNode->pLeftChild=NULL; newNode->pRightChild=NULL; if(tag) { node->pRightChild=newNode; }else{ node->pLeftChild=newNode; } if(preStrLength==1) { return; } //在midStr中查找preStr第一个元素,以构建新的左子树mid序列 while(*strMid!=value){ *leftNewMidStr=*strMid; leftNewMidStr++; strMid++; } strMid++; *leftNewMidStr='\0'; //printf("%s\n",leftMid); //剩下的就是右子树的mid序列 while(*strMid!='\0'){ *rightNewMidStr=*strMid; rightNewMidStr++; strMid++; } *rightNewMidStr='\0'; //printf("%s\n",rightMid); //构建左右子树的pre序列 strPre++; for(i=0;i<strlen(leftMid);i++) { *leftNewPreStr=*strPre; leftNewPreStr++; strPre++; } *leftNewPreStr='\0'; //printf("%s\n",leftPre); for(int i=0;i<=strlen(rightMid);i++) { *rightNewPreStr=*strPre; rightNewPreStr++; strPre++; } //printf("%s\n",rightPre); //重建左子树 reBuild(leftPre,strlen(leftPre),leftMid,strlen(leftMid),newNode,0); //重建右子树 reBuild(rightPre,strlen(rightPre),rightMid,strlen(rightMid),newNode,1); } int main() { char *preStr=(char *)malloc(sizeof(100)); char *midStr=(char *)malloc(sizeof(100)); ListNode *pHeader=(ListNode *)malloc(sizeof(ListNode)); pHeader->pLeftChild=NULL; pHeader->pRightChild=NULL; pHeader->value=-1; gets(preStr); gets(midStr); reBuild(preStr,strlen(preStr),midStr,strlen(midStr),pHeader,0); lastSearch(pHeader->pLeftChild); system("pause"); return 0; }
相关推荐
大连理工大学数据结构上机 二叉树三种遍历,先序和中序建立二叉树,后序和中序建立二叉树,二叉搜索树查找,删除,插入
定义二叉树类,封装构造二叉树操作、遍历操作. 实现由先序、中序序列构造二叉树的算法 实现由后序、中序序列构造二叉树的算法
二叉树从中序后序得出先序序列或者从中序先序得出后序的递归算法实现
根据给定文件的信息,本文将围绕“已知先序和中序遍历序列,求后序遍历序列”的核心主题进行展开,详细解析其中涉及的数据结构与算法,并深入理解其在C语言中的实现细节。 ### 数据结构:二叉树 在计算机科学中,*...
[问题描述] 建立二叉树,并输出二叉树的先序,中序和后序遍历序列,以及二叉树的叶子数。 [基本要求] 要求根据读取的元素建立二叉树,能输出各种遍历。 [实现提示] 可通过输入带空格的前序序列建立二叉链表。
二叉树的遍历是理解并操作二叉树的基础,通常有三种主要的遍历方式:先序遍历、中序遍历和后序遍历。这些遍历方法可以分为递归和非递归两种实现方式。递归方式虽然简单易懂,但在实际应用中可能因为递归层数过深导致...
这个是数据结构中关于由先序和中序序列确定二叉树。
根据题目描述,我们需要编写一个程序,该程序能够接收两行输入,分别是先序遍历序列和中序遍历序列,并根据这两组序列重建二叉树。 1. **定义节点结构**:首先,我们需要定义一个结构体`BTNode`来表示二叉树中的每...
主函数中首先读取用户输入的先序遍历和中序遍历序列,检查输入是否有效(长度相等且无重复),然后调用`createBT()`函数构建二叉树,并最终调用`print()`函数输出构建好的二叉树。 ### 四、注意事项 - 在实际应用...
根据以上知识点,我们可以总结出该实验报告主要涉及构建二叉树(特别是基于先序和中序遍历序列),以及利用栈实现二叉树的后序遍历算法。在实现过程中,采用了C语言的结构体和指针操作,以及标准输入输出函数。这些...
综上所述,通过理解并掌握这些知识点,读者可以学会如何使用Python来实现二叉树的先序、中序和后序遍历的构造与输出。同时,文中提及的其他专题资料,如《Python数据结构与算法教程》、《Python编码操作技巧总结》等...
根据给定文件的信息,本次实验的主要目标是通过编程来实现对二叉树的先序、中序、后序遍历,并找到这些遍历次序下的第k个访问节点。接下来,我们将详细介绍实验的要求、设计思路、算法实现以及部分关键代码。 ### ...
C语言,数据结构课程,知道中序和后序遍历,画二叉树和写出前序遍历。
用C++写的二叉树先序遍历、中序遍历和后序遍历非递归算法
3. 主函数:void main(),读取输入的先序和中序序列,创建二叉树,并进行后序遍历输出。 4. 子函数一,创建二叉树:struct node * create(snode *s,snode1 *s1,char a[MAX],char b[MAX]),使用栈实现非递归的建立...
二叉树先序和中序求后序的代码。已知道先序是中序如何找后序的方法。
数据结构C++二叉链表的先序遍历、中序遍历和后序遍历实现
本程序实现了三种主要的二叉树遍历方法:先序遍历、中序遍历和后序遍历。以下是关于这些遍历方法的详细解释: 1. 先序遍历(Preorder Traversal): - 访问根节点。 - 对左子树进行先序遍历。 - 对右子树进行...