| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 693 人关注过本帖
标题:数据结构那些小事 求教大虾~~ 关于二叉树的!
只看楼主 加入收藏
浪群
Rank: 1
等 级:新手上路
帖 子:29
专家分:6
注 册:2011-8-29
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:8 
数据结构那些小事 求教大虾~~ 关于二叉树的!
根据已知的二叉树先序序列和中序序列 还原二叉树!  想知道递归的方法 ···   
搜索更多相关主题的帖子: 二叉树 
2011-10-25 21:53
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
设先序列为数组f,中序序列为数组m。
a = f[0],为根,在m中查找a,设为m[i]。
在f中查找m[i - 1],设为f[j]。
则f[1]至f[j]与m[0]至m[i - 1]对应结点a的左子树的先序与中序,f[j + 1]至末尾与m[i + 1]至末尾对应结点a的右子树的先序与中序。
对于两棵子树重复上一过程。
用f[0]是为了表述方便,在递归中可以用from,to两个变量来标识子序列的起始元素索引与末尾元素索引。

重剑无锋,大巧不工
2011-10-25 22:07
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
收藏
得分:0 
回复 2楼 beyondyf
给个代码看看吧,光看文字不直观。

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2011-10-25 22:16
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
正在4S店做保养,这里的电脑居然不能用五笔,用拼音就像拔牙一样难受,回家我写一段示例。

重剑无锋,大巧不工
2011-10-26 10:06
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:20 
送一段示例。
时间仓促,只做了一两组测试,不排除存在BUG,欢迎指正
程序代码:
#include<stdio.h>
#include<malloc.h>
//结点定义
typedef struct _node
{
    int value;
    struct _node *left;
    struct _node *right;
} NODE;
//生成结点
NODE * newNode()
{
    NODE * p;
    p = (NODE *)malloc(sizeof(NODE));
    if(p == NULL) return NULL;
    p->value = 0;
    p->left = NULL;
    p->right = NULL;
    return p;
}
//销毁结点
void disposeNode(NODE * p)
{
    free(p);
}
//销毁树
void disposeTree(NODE * root)
{
    if(root->left != NULL) disposeTree(root->left);
    if(root->right != NULL) disposeTree(root->right);
    disposeNode(root);
}
//根据先序与中序遍历结果重建树
// preorder:    先序遍历结果数组
// inorder:        中序遍历结果数组
// len:            数组的长度
// 返回值:        指向树根结点的指针
NODE * buildTree(int * preorder, int * inorder, int len)
{
    int i;
    NODE * root;
    if(len <= 0) return NULL;
    root = newNode();
    root->value = preorder[0];
    for(i = 0; i < len && inorder[i] != preorder[0]; i++);
    if(i == len) return NULL;
    root->left = buildTree(preorder + 1, inorder, i);
    root->right = buildTree(preorder + i + 1, inorder + i + 1, len - i - 1);
    return root;
}
void subShowTree(NODE * root, int deep)
{
    int i;
    if(root == NULL) return;
    printf("%-5d", root->value);
    if(root->right != NULL) subShowTree(root->right, deep + 1);
    if(root->left != NULL)
    {
        printf("\n");
        for(i = 0; i < deep; i++) printf("     ");
        printf("+    ");
        subShowTree(root->left, deep + 1);
    }
}
//打印树的结构
//结果中某一元素右侧的值为它的右子结点的值,其正对下方的+号右侧的值为它的左子结点的值
void showTree(NODE * root)
{
    subShowTree(root, 0);
}
int main()
{
    int preorder[] = {1, 2, 4, 5, 7, 3, 6};
    int inorder[] = {4, 2, 7, 5, 1, 3, 6};
    NODE * tree;
    tree = buildTree(preorder, inorder, 9);
    showTree(tree);
    disposeTree(tree);
    return 0;
}

输出的结果为
1    3    6   
+    2    5   
          +    7   
     +    4   

结果的意义我在输出函数前的注释里解释了,不理解我再解释。

重剑无锋,大巧不工
2011-10-26 14:25
浪群
Rank: 1
等 级:新手上路
帖 子:29
专家分:6
注 册:2011-8-29
收藏
得分:0 
      给力啊!!!    O(∩_∩)O哈哈~   虽然介个程序写得有点复杂··不过基本思路  已经理解了··  ·
程序代码:
#define EL 10
#define TEL 2*EL+1
#define LEN sizeof(struct node)
#include<stdio.h>
#include<stdlib.h>
char pre[TEL]="abdhiecfg";
char pin[TEL]="hdibeafcg";
typedef struct node{
    char data;
    struct node * lch,*rch;
}BTNode,*BTree;
BTNode root;
BTree rt=&root;
int pos(char c,char s[],int st){
    char *p;
    p=s+st;
    while(*p!=c && *p!='\0') 
        p++;
    return p-s;
}
void create(BTree *t,int i1,int i2,int len){
    int r,llen,rlen;
    if(len<=0) 
        *t=NULL;
    else{
        *t=(BTree)malloc(LEN);
        (*t)->data=pre[i1];
        r=pos(pre[i1],pin,i2);
        llen=r-i2;
        rlen=len-(llen+1);
        create(&(*t)->lch,i1+1,i2,llen);
        create(&(*t)->rch,i1+llen+1,r+1,rlen);
    }
}

void travel(BTree t){
    if(t){
        travel(t->lch);
        travel(t->rch);
        putchar(t->data);
    }
}

void main(){
    create(&rt,0,0,EL);
    if(rt) 
        travel(rt);
    printf("\n");
}
2011-10-26 18:10
浪群
Rank: 1
等 级:新手上路
帖 子:29
专家分:6
注 册:2011-8-29
收藏
得分:0 
回复 6楼 浪群
基本思路跟你的一样··  只是写得有点不同  (*^__^*) 嘻嘻……
2011-10-26 18:12
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
收藏
得分:0 
如果你想要的仅仅是后序遍历或层序遍历的结果,那根本没必要重建树。树的结构本就隐含在遍历的过程中了。
看起来像道ACM题的要求,我好像在哪儿见过。

重剑无锋,大巧不工
2011-10-26 18:30
浪群
Rank: 1
等 级:新手上路
帖 子:29
专家分:6
注 册:2011-8-29
收藏
得分:0 
真是见多识广 啊!!  O(∩_∩)O哈哈~    这是我实验报告选题啦···  搞了好久··
2011-10-26 19:59
快速回复:数据结构那些小事 求教大虾~~ 关于二叉树的!
数据加载中...
 
   



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

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