欢迎访问binary的Blog   虚心使人进步,骄傲使人落后。

          W3CHINA Blog首页    管理页面    写新日志    退出



«September 2025»
123456
78910111213
14151617181920
21222324252627
282930


登录

用户名称:
登陆密码:
密码保存:


联系我
email: binaryluo(at)gmail.com

我的分类

日志更新

最新评论

留言板

Blog信息

 
blog名称:二进制-虚心使人进步,骄傲使人落后。
日志总数:42
评论数量:370
留言数量:88
访问次数:639496
建立时间:2005年2月19日




[算法设计与分析][原创]已知先序中序序列求二叉树算法
原创空间,  软件技术

binaryluo 发表于 2005/12/10 16:57:00

最近复习都忙不赢上论坛了,前天看二叉树的时候写了个知先序中序序列确定二叉树的算法,现在贴出来供大家参考。:) 算法:(类C语言描述)#define   FALSE    0#define  算法:(类C语言描述)#define   FALSE    0#define   TRUE     1typedef int Status;Status createTree(BiTree &T, BiTNode pre[], BiTNode order[]){          // 已知先序序列pre和中序序列order,构建一个二叉树T的非递归实现。          // 其中涉及到的数据结构请参看清华大学《数据结构》(C语言版)          InitStack(Stack);        //初始化栈          for (i = 0; i < order.length; i ++) visited[ i ] = FALSE;                                            // 初始化visited,visited用于标记order                                            // 中的元素是否已经被访问过          T = (BiTree *) malloc (sizeof(BiTree));          T.data = pre[0]; T -> lchild = NULL; T -> rchild = NULL;                                           // 生成根节点,先序pre中的第一个元素肯定是树根,                                           // 左右孩子初始化为NULL。          p = LocateElem(order, pre[0].data);   // 在order中找到根节点所在的位置          visited[ p ] = TRUE;                         // 标识order中的根元素已被访问过          cur = T;                                    // cur表示当前构建的节点          for (i = 1; i < pre.length; ) {                                if (p > 0 && !visited[p - 1]) {                        // 在order中pre[ i ]的左边有元素并且未被访问过,说明有左子树存在,                        // 生成左子树                        cur->lchild = (BiTNode *) malloc (sizeof(BiTNode));                        cur->lchild.data = pre[ i ];                                        // 将当前pre中的元素赋给lchild后指向下一个元素                        cur->lchild->lchild = NULL; cur->rchild->rchild= NULL;                        p = LocateElem(order, pre[ i ++].data); // 定位pre[ i ]的位置                        visited[ p ] = TRUE;                        Push(Stack, cur);        // 当前节点进栈                        cur = cur->lchild;        // 当前节点指向左孩子                }                else if (p < order.length && !visited[p + 1]) {                        // 生成右子树                        cur->rchild = (BiTNode *) malloc (sizeof(BiTNode));                        cur->rchild.data = pre[ i ];                        cur->rchild.lchild = NULL; cur->rchlid.rchild = NULL;                        p = LocateElem(order, pre[ i ++].data); // 定位pre[ i ]的位置                        visited[ p ] = TRUE;                        cur = cur->rchild;                }                else {                        Pop(Stack, cur);        // 左右都没有子树即是叶子,则退栈                        p = LocateElem(order, cur.data); // 重新定位p的位置                }          }} 算法分析:假设有n个节点,在初始化visited时(第一个for循环)赋值次数等于order的长度n,生成左右子树时(第二个for循环)外层循环为n-1次,其中定位pre[ i ]时最坏比较n次,所以基本操作次数是n+n*(n-1),时间复杂度为O(n方)。根据这个非递归要写出递归实现很简单,只需将if-else里的不分改成递归调用就行。该算法的改进算法请参考该帖:http://www.ieee.org.cn/dispbbs.asp?boardID=60&ID=25234 附代码(C版本):2008/1/6日更新500)this.width=500'>BinTree.rar 


阅读全文(3951) | 回复(1) | 编辑 | 精华
 


回复:[原创]已知先序中序序列求二叉树算法
原创空间,  软件技术

aaa(游客)发表评论于2007/1/8 8:22:42

hao 


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144785716 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号