http://ac.jobdu.com/problem.php?pid=1078
二叉树遍历
#include<stdio.h>
#include<string.h>
//二叉树结点的描述
typedef struct BinaryTreeNode
{
char data;
struct BinaryTreeNode *lchild, *rchild; //左右孩子
}BinaryTreeNode,*BinaryTree;
inline BinaryTreeNode* ConstructCore(char *startPreorder, char *endPreorder, char *startInorder, char *endInorder)
{
//前序遍历序列的第一个字符是根节点的值
char rootValue = startPreorder[0];
BinaryTreeNode* root = new BinaryTreeNode();
root->data = rootValue;
root->lchild = root->rchild = NULL;
if(startPreorder == endPreorder)
{
if(startInorder == endInorder && *startPreorder== *startInorder)
return root;
}
//在中序遍历中找到根节点的值
char *rootInorder = startInorder;
while(rootInorder <= endInorder && *rootInorder != rootValue)
rootInorder++;
int leftLength = rootInorder - startInorder;
char *leftPreorderEnd = startPreorder + leftLength;
if(leftLength > 0)
{
//构建左子树
root->lchild = ConstructCore(startPreorder+1, leftPreorderEnd, startInorder, rootInorder-1);
}
if(leftLength < endPreorder - startPreorder)
{
//构建右子树
root->rchild = ConstructCore(leftPreorderEnd+1, endPreorder, rootInorder+1, endInorder);
}
return root;
}
//分别在前序遍历和中序遍历的序列中确定左、右子树的子序列
inline BinaryTreeNode* Construct(char *preorder, char *inorder, int length)
{
if(preorder == NULL || inorder == NULL || length<=0)
return NULL;
return ConstructCore(preorder, preorder+length-1, inorder, inorder+length-1);
}
//后序遍历
inline void PostOrder(BinaryTreeNode *root)
{
if(root==NULL)
return ;
PostOrder(root->lchild); //递归调用,前序遍历左子树
PostOrder(root->rchild); //递归调用,前序遍历右子树
printf("%c", root->data); //输出数据
}
//释放二叉树
inline void DeleteBinaryTree(BinaryTree root)
{
if(root)
{
DeleteBinaryTree(root->lchild); //释放左子树
DeleteBinaryTree(root->rchild); //释放右子树
delete root; //释放根结点
}
}
int main(void)
{
int length;
char preorder[27],inorder[27];
while(scanf("%s",preorder)!=EOF)
{
scanf("%s",inorder);
length = strlen(preorder);
BinaryTreeNode* root = Construct(preorder, inorder, length);
PostOrder(root);
printf("\n");
DeleteBinaryTree(root);
}
return 0;
}
分享到:
相关推荐
清华大学计算机考研真题清华大学计算机考研真题清华大学计算机考研真题清华大学计算机考研真题清华大学计算机考研真题清华大学计算机考研真题清华大学计算机考研真题清华大学计算机考研真题清华大学计算机考研真题...
清华大学计算机专业历年考研真题,真实可信,谢谢分享。
【标题】"2017年清华大学856中国文学史考研真题"涉及的是一个教育领域的专业知识点,主要涵盖2017年度清华大学研究生入学考试中856科目——中国文学史的实际试题内容。这一资源对于备考清华大学中国文学史专业的学生...
【清华大学2006年电路考研真题】是高等教育领域内一项重要的考试参考资料,它代表了清华大学在选拔研究生时对电路理论知识的期望与要求。电路理论是电气工程及其自动化、电子科学与技术等专业的重要基础课程,涵盖了...
1994年清华大学计算机科学与技术系硕士生入学考试试卷扫描版
该资源为清华大学837物理化学历年考研真题汇编,资源高清无水印哦! 该资源为清华大学837物理化学历年考研真题汇编,资源高清无水印哦!
清华大学计算机类912考研的历年真题-本科期末试卷.zip
清华大学计算机系912考研真题回忆版,覆盖全面,包括计算机网络、数据结构、计算机组成原理、操作系统等,基本覆盖所有题目,放心下载
对于正在备战清华大学计算机专业研究生考试的同学来说,历年真题无疑是宝贵的复习资源。2017年的912计算机考研真题,尽管是回忆版,但其价值不言而喻。这份资料可以帮助考生了解考试的题型、难度以及重点内容,从而...
《清华大学912考研真题(2016-2020年)》这个压缩包文件包含了近五年来清华大学912科目研究生入学考试的完整试题,是备考清华大学相关专业硕士研究生的重要参考资料。这份资料的价值在于它为考生提供了真实、权威的...
清华大学计算机研究生课程表.docx
2021年清华大学912计算机专业基础综合考研真题是广大备考学子关注的重点,因为它不仅反映了清华大学对考生知识水平的要求,也揭示了计算机学科的基础知识体系和研究热点。本资源包含了一份高清无水印的2021年考研...
根据提供的信息,“2000年清华大学计算机原理考研试题”,我们可以从中提炼出一系列与计算机原理相关的知识点。虽然没有具体的试题内容,但是基于标题、描述以及常见的计算机原理考试内容,我们可以推测该试题集主要...
2019年清华大学的856文学基础考研真题,是广大考生备考的重要参考资料。这门考试旨在考察学生对文学理论、中国古代文学、中国现代文学以及外国文学等领域的深厚理解和扎实基础。通过对这份真题的学习和分析,考生...
该资源为2010-2012年清华大学845经济学考研真题,资源高清无水印哦! 该资源为2010-2012年清华大学845经济学考研真题,资源高清无水印哦!
清华大学2002年电路考研真题 清华大学2002年电路考研真题
【清华大学历年计算机考研题】是一份集合了自2001年以来清华大学计算机科学与技术专业研究生入学考试试题的宝贵资源。这份资料对于准备考取清华大学计算机专业的学生来说,具有极高的参考价值。它包含了历年来的真题...
【清华大学计算机系历年硕士入学考试试题】是一份珍贵的学习资源,涵盖了计算机科学与技术领域的广泛知识,对于准备参加清华大学硕士研究生入学考试的学生来说,具有极高的参考价值。这些试题不仅展示了清华大学对...