二叉树重建[通俗易懂]

二叉树重建

大家好,又见面了,我是全栈君。

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

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

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;}

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116630.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • java的句柄_java获取窗口句柄

    java的句柄_java获取窗口句柄Java代码书写过程,文件资源的释放需要特别谨慎的对待.通常文件资源使用后必须close,然后再删除。如果先删除但没有close掉,会造成文件句柄未被释放.这会造成实际使用磁盘空间较大,成为瓶颈importjava.io.File;importjava.io.FileOutputStream;importjava.io.IOException;publicclassFileTest{p…

    2022年10月18日
    0
  • java按字节、字符、行、随机读取文件,并设置字符编码格式

    java按字节、字符、行、随机读取文件,并设置字符编码格式

    2021年7月18日
    65
  • ios动态视频_手机怎么暂停gif

    ios动态视频_手机怎么暂停gif其实网上GitHub有很多第三方的,但是用起来比较麻烦,这里介绍最简单的一种方式,自己就可以实现,(点击按钮开始播放动态图)1,集成SDWebImage之后,引入头文件#import"U

    2022年8月1日
    5
  • NAND FLASH_Flash下载

    NAND FLASH_Flash下载作者:德州仪器现场技术支持工程师孟海燕概要:本文介绍了DM368NANDFlash启动的原理,并且以DM368 IPNC参考设计软件为例,介绍软件是如何配合硬件实现启动的。关键字:NANDFlash启动,RBL,UBL           芯片上电后是如何启动实现应用功能的?这是许多工程师在看到处理器运行的时候,通常都会问的一个问题。下面我们就以德州仪器的多媒体处理芯

    2022年8月13日
    3
  • Maven历史版本下载「建议收藏」

    Maven历史版本下载「建议收藏」一.Maven官网下载历史版本1.maven下载地址(1)、打开Mvaen官网下载地址(2)、进入历史版本下载地址(3)、历史版本下载页面,选择一个版本进入。(4)、我们选择一个历史版本进来后显示二进制和源码两个下载方式。二进制版本是编译好的,可以直接使用。源码版本未经编译,需要自行编译(5)、选择二进制版本,点击进入下载。(6)、下载下来后直接解压就可以使用了。…

    2022年8月21日
    7
  • 现代OpenGL教程 01 – 入门指南

    文章转载自:http://huangwei.pro/2015-05/modern-opengl1/以下是我学习opengl得到的启示最多的一篇文章,我强烈地建议大家去读一下这位大神的文章!译序早前学OpenGL的时候还是1.x版本,用的都是glVertex,glNormal等固定管线API。后来工作需要接触DirectX9,shader也只是可选项而已,跟固定管线一起混用着

    2022年4月6日
    43

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号