| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 417 人关注过本帖
标题:二叉树知前序,中序,中序,后序,恢复树。求层次遍历,和中序的恢复树?
只看楼主 加入收藏
nealgavin
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2012-12-18
收藏
 问题点数:0 回复次数:1 
二叉树知前序,中序,中序,后序,恢复树。求层次遍历,和中序的恢复树?
/*
     功能: 1.利用树的前序和中序序列创建树
           2.利用树的后序和中序序列创建树
 */
 #include <iostream>
 #include <cstring>
 using namespace std;

 char pre[50] = "ABDHLEKCFG";        //前序序列
 char mid[50] = "HLDBEKAFCG";        //中序序列
 char post[50] = "LHDKEBFGCA";        //后序序列

 typedef struct _Node
 {
     char v;
     struct _Node *left;
     struct _Node *right;
     _Node(){left=NULL;right=NULL;}
 }Node, *PNode;

 void PostTravelTree(PNode pn);        //树的后序递归遍历
 void PreTravelTree(PNode pn);        //树的前序递归遍历
 void PreMidCreateTree(PNode &pn, int i, int j, int len);        //利用前序中序序列创建树
 void PostMidCreateTree(PNode &pn, int i, int j, int len);        //利用后序中序序列创建树
 int Position(char c);                //确定c在中序序列mid中的下标,假设树的各个节点的值各不相同


 int main()
 {
     PNode root1 = NULL, root2= NULL;

     PreMidCreateTree(root1, 0, 0, strlen(mid));
     PostTravelTree(root1); cout<<endl;
     PostMidCreateTree(root2, strlen(post)-1, 0, strlen(mid));
     PreTravelTree(root2); cout<<endl;

     return 0;
 }


 int Position(char c)
 {
     return strchr(mid,c)-mid;
 }


 /*  
  *        i: 子树的前序序列字符串的首字符在pre[]中的下标
  *        j: 子树的中序序列字符串的首字符在mid[]中的下标
  *      len: 子树的字符串序列的长度
  */
 void PreMidCreateTree(PNode &pn, int i, int j, int len)
 {
     if(len <= 0)
         return;

     pn = new Node;
     pn->v = pre[i];
     int m = Position(pre[i]);
     PreMidCreateTree(pn->left, i+1, j, m-j);            //m-j为左子树字符串长度
     PreMidCreateTree(pn->right, i+(m-j)+1, m+1, len-1-(m-j));    //len-1-(m-j)为右子树字符串长度
 }


 /*  利用后序中序序列创建树
  *        i: 子树的后序序列字符串的尾字符在post[]中的下标
  *        j: 子树的中序序列字符串的首字符在mid[]中的下标
  *      len: 子树的字符串序列的长度
  */
 void PostMidCreateTree(PNode &pn, int i, int j, int len)
 {
     if(len <= 0)
         return;

     pn = new Node;
     pn->v = post[i];
     int m = Position(post[i]);
     PostMidCreateTree(pn->left, i-1-(len-1-(m-j)), j, m-j);//注意参数:m-j左子树的长度,len-1-(m-j)右子树的长度
     PostMidCreateTree(pn->right, i-1, m+1, len-1-(m-j));
 }


 void PostTravelTree(PNode pn)        //后序递归遍历
 {
     if(pn)
     {
         PostTravelTree(pn->left);
         PostTravelTree(pn->right);
         cout<<pn->v<<" ";
     }
 }


 void PreTravelTree(PNode pn)        //前序递归遍历
 {
     if(pn)
     {
         cout<<pn->v<<" ";
         PreTravelTree(pn->left);
         PreTravelTree(pn->right);
     }
 }
搜索更多相关主题的帖子: include 二叉树 
2012-12-18 17:26
w527705090
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:11
帖 子:441
专家分:1882
注 册:2011-6-28
收藏
得分:0 
这么长的代码都不给分。。。太小气了。。。

有心者,千方百计;无心者,千难万难。
2012-12-19 19:49
快速回复:二叉树知前序,中序,中序,后序,恢复树。求层次遍历,和中序的恢复树 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018532 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved