poj_2255 Tree Recovery(已知前序遍歷和中序遍歷求後序遍歷)

来源:互联网 发布:淘宝网假冒材质成分 编辑:程序博客网 时间:2024/06/05 09:54

   我們知道,已知前序遍歷和中序遍歷可以畫出一棵樹,但我卻沒想到如何把這課樹保存下來并做後序遍歷。後來上網看了算法,發現并不需要將原來的樹還原,只需要根據前序和中序遍歷每次得到一個樹根,然後根據遞歸的順序印出樹根就是後序遍歷的順序了。。。

下面的代碼:

#include<stdio.h>#include<stdlib.h>#include<string.h>char preorder[30],inorder[30];int find_root(char c,int s,int e)//在中序遍歷中尋找根的位置,根在中序遍歷的位置作為返回值{ int i,j;  for(i=s;i<=e;i++)   if(inorder[i]==c) return i;}void traversal(int s1,int e1,int s2,int e2){  int k,i,j;  char root;  if(s2>e2) return;// 如果中序遍歷的起始位置大於結束位置,則返回,結束  if(e2==s2) {printf("%c",inorder[e2]); return;}//只有一個節點時先輸出後返回,結束  root=preorder[s1];     //因為是前序遍歷,所以第一個位置的節點即為當前樹的樹根  k=find_root(root,s2,e2);   traversal(s1+1,s1+k-s2,s2,k-1);   //先做左子樹的遞歸(因為k為當前樹根在原中序遍歷中的位置,所以當前左子樹之節點數為k-s2   traversal(s1+k-s2+1,e1,k+1,e2);   //再做右子樹的遞歸   printf("%c",root);  //印出樹根}int main(){  int length; while((scanf("%s %s",preorder,inorder))!=EOF)//輸入前序遍歷和中序遍歷 {  length=strlen(preorder);                    //得到樹的節點個數  traversal(0,length-1,0,length-1);  //以兩個遍歷順序的起始和結束位置為函數的參數    printf("\n"); } return 0;}


 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 现在黄金多少钱一克 今日黄金多少钱一克 中国今日金价多少一克 今日9999金价多少一克 黄金现在多少钱一克 金价今日价格多钱一克 老凤祥黄金多少钱一克 今天银价格多少一克 沉香价格多少钱一克 黄金今日价格多少一克 目前黄金价格多少一克 黄金市场价多少一克 白金价格今天多少一克 18k金价格今天多少一克 黄金市场价格多少一克 奇楠沉香多少钱一克 纯银价格今天多少一克 二手黄金多少钱一克 黄金价格是多少一克 今日国际金价多少一克 黄金现在什么价格一克 饰品金价格今日一克多少钱 黄金加工费多少一克 现在的黄金价格多少一克 今天国际金价多少一克 回收黄金价格多少一克 金条回收多少钱一克 现在黄金什么价格一克 黄金价格回收多少一克 2013年黄金价格多少一克 今日黄金回收多少一克 18k白金回收多少钱一克 现在回收黄金多少一克 2019年今日9999金价多少一克 9999黄金价格今天多少一克 黄金饰品价格今天多少一克 黄金手饰价格今天多少一克 黄金收购价格今天多少一克 明牌黄金价格今天多少一克 现在黄金首饰价格多少一克 999黄金价格今天多少一克