二叉树重建[通俗易懂]

二叉树重建

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

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

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

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • asp.net(c#)网页跳转七种方法小结

    asp.net(c#)网页跳转七种方法小结①response.redirect这个跳转页面的方法跳转的速度不快,因为它要走2个来回(2次postback),但他可以跳转到任何页面,没有站点页面限制(即可以由雅虎跳到新浪),同时不能跳过登录

  • mysql 修改密码报错解决[通俗易懂]

    mysql 修改密码报错解决[通俗易懂]报错信息如下:ERROR1064(42000):YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear'(‘123456’)whereuser=’root”atli…

  • 常用Eclipse快捷方式

    Ctrl+1快速修复Ctrl+D:删除当前行Ctrl+Alt+↓复制当前行到下一行(复制增加)Ctrl+Alt+↑复制当前行到上一行(复制增加)Alt+↓当前行和下面一行交互位置(特

    2021年12月26日
  • 快速排序的4种优化[通俗易懂]

    快排思想快排基准的选择固定基准随机基准三数取中快速排序的优化优化1:序列长度达到一定大小时,使用插入排序优化2:尾递归优化优化3:聚集元素优化4:多线程处理快排快排思想快排算法是基于分治策略的排序算法,其基本思想是,对于输入的数组a[low,high],按以下三个步骤进行排序。(1)分解:以a[…

  • B2C电商系统源码 在线商城源码[通俗易懂]

    B2C电商系统源码 在线商城源码[通俗易懂]B2C产品采用SSH+Jquery框架开发。具备构建大型电商平台的底层技术体系。支持Oracl与Mysql等多个主流数据库。一、商品系统支持实物与虚拟商品体系。无限制级商品分类与扩展。智能商品模板、个性定义商品属性与属性继承与关联。商品与资讯的智能关联、商品关键字维护,SEO效果更为高效、精准。二、订单系统完善订单流管理、精准跟踪状态与执行人分派。支持来自电商、电话以及渠道的多订单体系。支持订单全流程服务(订单打印、发运、到货、退货、换货、拒收)等。三、会员系统围绕会员精细服

  • 初识ABP vNext(9):ABP模块化开发-文件管理

    初识ABP vNext(9):ABP模块化开发-文件管理

    2020年11月20日

发表回复

您的电子邮箱地址不会被公开。

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