二叉树重建[通俗易懂]

二叉树重建

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

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

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

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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 熊猫烧香病毒简析[通俗易懂]

    熊猫烧香病毒简析[通俗易懂]熊猫烧香从2007年1月肆虐网络到现在。已经过了查不多4个年头了。病毒的作者李俊现在也从监狱里被放了出来。在当时熊猫烧香确实给大家一个意外,它采用了一种新的方式对计算机的程序和系统造成了很严重的破坏。 其实我的这篇文章也不叫什么分析,只是说简单的简析。我只是简单的对病毒的机

    2022年10月28日
  • 京东云 服务器_京东云服务器免费体验

    京东云 服务器_京东云服务器免费体验哈哈哈~又来“打广告”了~~~一开始用着华为云服务不错,只不过因为自己一时粗心忘了密码,找回密码又比较麻烦,所以从网上搜免费的云服务器。果然发现了京东云……(虽然是第一次见),不过确实方便好用。好处如下:*实名认证方式就比较简单,不需要拿着身份证照来照去了,审核基本是秒过*功能操作比较简单*免费半年使用权(主要是这个原因)注册账号领取免费套餐注册账号:1、进入官网,直接

    2022年10月14日
  • 你还在认为 Java 是免费的吗[通俗易懂]

    你还在认为 Java 是免费的吗[通俗易懂]在收购了Sun公司的六年后,Oracle正在大规模的加大对违反其许可证的Java客户的审查力度。越来越多的Oracle客户和合作伙伴被拉里·埃里森的团队约谈,声称他们没有遵守Java的规矩。Oracle在2010年 收购了SunMicrosystems公司 ,知情人士透露现在它的许可证管理服务(LMS)正在到处追缴付款。该数据库巨头公司目前已经在全球

    2022年7月9日
  • 学习笔记:远程连接服务之SSH

    学习笔记:远程连接服务之SSH

    2021年6月5日
  • fp5138升压电路图_大电流升压芯片

    fp5138升压电路图_大电流升压芯片外置MOS大功率升压IC

    2022年10月6日
  • wd移动硬盘测试软件,西数硬盘修复工具(WD HDD Repair Tools)「建议收藏」

    WDHDDRepairTools是西部数据(WD)官方发布的一款西数硬盘检测修复工具,它可显示寄存器状态,支持WD-L/WD-ROYL板,能进行硬盘软复位,可识别硬盘,查看或清除SMART,起转电机及直接复位,加载瞬时及永久覆盖,操作磁道、FLASH及模块。改变内存中的磁头位置,编辑列表,设置最高容量及目标容量。格式化硬盘/保留区,校验伺服系统及磁头。清除异常中断代码及软件错误数。重新构…

    2022年4月16日

发表回复

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

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