zoukankan      html  css  js  c++  java
  • 二叉树重建

    一、已知先序遍历和中序遍历。求后序遍历。

    http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=944

    依据先序遍历和中序遍历还原二叉树的主要思想:

    1、先序遍历序列的第一个元素必然是根节点,能够由此获取二叉树的根节点。

    2、依据根节点,在中序遍历序列中查找该节点。由中序遍历的性质可知。中序遍历中该根节点左边的序列必然在根节点的左子树中,而根节点右边的序列必然在右子树中。由此能够知道先序遍历中左子树以及右子树的起止位置。

    3、分别对左子树和右子树反复上述的过程,直至全部的子树的起止位置相等时。说明已经到达叶子节点,遍历完成。

    实现代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    struct Node
    {
        char value;
        Node *left, *right;
    };
    Node *build_new_node(char ch)
    {
        Node *p = (Node*)malloc(sizeof(Node));
        p->value = ch;
        p->left = p->right = NULL;
        return p;
    }
    Node *Rebuild(char *pre, char *in, int n)
    {
        if(n == 0) return NULL;
        char ch = pre[0];
        Node *p = build_new_node(ch);
        int i;
        for(i = 0; i < n && in[i] != ch; i++);
        int l_len = i;
        int r_len = n - i - 1;
        if(l_len > 0) p->left = Rebuild(pre+1, in, l_len);
        if(r_len > 0) p->right = Rebuild(pre+l_len+1, in+l_len+1, r_len);
        return p;
    }
    void PostOrder(Node *p)
    {
        if(p == NULL) return ;
        PostOrder(p->left);
        PostOrder(p->right);
        printf("%c",p->value);
    }
    int main()
    {
        char PreOrder[100], inOrder[100];
        while(~scanf("%s%s",PreOrder, inOrder))
        {
            Node *root = Rebuild(PreOrder,inOrder,strlen(PreOrder));
            PostOrder(root);
            printf("
    ");
        }
        return 0;
    }

    二、已知中序遍历和后序遍历,求先序遍历。

    http://acm.nyist.net/JudgeOnline/problem.php?pid=756

    依据中序遍历和后序遍历还原二叉树的主要思想:

    1、后序遍历序列的最后一个元素必然是根节点,能够由此获取二叉树的根节点。

    2、依据根节点,在中序遍历序列中查找该节点,由中序遍历的性质可知,中序遍历中该根节点左边的序列必然在根节点的左子树中,而根节点右边的序列必然在右子树中。

    由此能够知道后序遍历中左子树以及右子树的起止位置。

    3、分别对左子树和右子树反复上述的过程,直至全部的子树的起止位置相等时,说明已经到达叶子节点。遍历完成。

    实现代码:

    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    struct Node
    {
        char value;
        Node *left, *right;
    };
    Node *build_new_node(char ch)
    {
        Node *p = (Node*)malloc(sizeof(Node));
        p->value = ch;
        p->left = p->right = NULL;
        return p;
    }
    Node *Rebuild(char *post, char *in, int n)
    {
        if(n == 0) return NULL;
        char ch = post[n-1];
        Node *p = build_new_node(ch);
        int i;
        for(i = 0; i < n && in[i] != ch; i++);
        int l_len = i;
        int r_len = n - i - 1;
        if(l_len > 0) p->left = Rebuild(post, in, l_len);
        if(r_len > 0) p->right = Rebuild(post + l_len, in+l_len+1, r_len);
        return p;
    }
    void PreOrder(Node *p)
    {
        if(p == NULL) return ;
        printf("%c",p->value);
        PreOrder(p->left);
        PreOrder(p->right);
    }
    int main()
    {
        char PostOrder[100], InOrder[100];
        while(~scanf("%s%s",PostOrder, InOrder))
        {
            Node *root = Rebuild(PostOrder,InOrder,strlen(PostOrder));
            PreOrder(root);
            printf("
    ");
        }
        return 0;
    }



  • 相关阅读:
    [TED]丹·吉尔伯特:我们为什么快乐?
    GTD 工具软件
    康奈尔笔记法(5R笔记法)
    ACM退役感言
    YCSB_对mongodb进行性能测试
    Python_列表比较大小
    Python_issubclass&isinstance方法和types&inspect内置模块
    由于未能创建 Microsoft Visual C# 2008 编译器,因此未能打开项目 "xxx" 的解决方法
    北京技能视频学习自动播放
    JQuery在UpdatePanel中当事件点击后JQuery事件不起作用的解决办法(JQuery与UpdatePanel问题解析)
  • 原文地址:https://www.cnblogs.com/yxwkf/p/5058019.html
Copyright © 2011-2022 走看看