码迷,mamicode.com
首页 > 其他好文 > 详细

二叉树重建

时间:2014-07-14 20:41:09      阅读:212      评论:0      收藏:0      [点我收藏+]

标签:style   blog   color   os   2014   for   

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

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

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("\n");
    }
    return 0;
}

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

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

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("\n");
    }
    return 0;
}



二叉树重建,布布扣,bubuko.com

二叉树重建

标签:style   blog   color   os   2014   for   

原文地址:http://blog.csdn.net/lyhvoyage/article/details/37757141

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!