根据先序和中序(中序和后序)确定二叉树
实在是恨自己智商欠费,一个二叉树搞了好长时间才弄清!!!
怎样通过先序和中序确定二叉树?
我的算法设计思路参考学习网上的,但代码是自己实现的,其实还是在创建二叉树的基础上添加一些条件。我们刚开始根据先序序列中第一个数据,在中序序列中找与该结点数据相等的与元素,将中序序列中该元素所在下标返回。创建节点,将先序序列的第一个有效元素存起来
。将中序序列中与前序序列当前第一个元素相等的元素所在位置置为’\0’,并将前序序列中的该元素所在位置值置为’\0’,先序序列的首个有效元素也同时应改为下一个元素(即此时遍历下标应后移)。这是建立二叉树之前所做的工作。
创建二叉树还是用递归,根据以上返回的下标将中序序列分为两部分,判断左边为空,就将创建节点的左孩子置为空,右边同理。
若不为空,前半部分为左子树,后半部分为右子树。
将前序序列和中序序列前半部分,以及创建的结点的左孩子指针传进去。递归调用函数。
将前序序列和中序序列后半部分,以及创建的结点的右孩子指针传进去。递归调用函数。
以上所述为火星人理解思路,看不懂不怪你们,怪我,表达上确实欠缺逻辑性,下面我们看代码就行~~~
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef struct node{char ch ;struct node * l,*r ;
}node_t,*node_l;void create_tree(node_l * root,char prelist[],char midlist[]);
int findIndex(char prelist,char* midlist);
void print(node_l root);
int main(){node_l root ;char prelist[100];char midlist[100];bzero(prelist,sizeof(prelist));bzero(midlist,sizeof(midlist));cin>>prelist;cin>>midlist;create_tree(&root,prelist,midlist);print(root);
}
void print(node_l root){if(root){print(root->l);print(root->r);cout<<root->ch<<"";}
}
//该函数时恢复二叉树的,root为根指,prelist为先序序列,midlist为中序序列
//三者在恢复二叉树的过程中时变化的
void create_tree(node_l* root,char prelist[],char midlist[]){//定义静态变量,因为每次前序每一个元素,就销毁一个元素,//下标也作相应的移动。static int index = 0; int mid_index ;//传入前序序列的首元素,在中序列中搜索 ,记录元素在中序序列中所处的下标 mid_index = findIndex(prelist[index],midlist);*root = (node_l)malloc(sizeof(node_t));//将节点数据存在根结点中(*root)->ch = prelist[index];将先序已遍历的数据全置为‘\0’prelist[index++]='\0' ;//将中序的那个数据所处位置置为'\0'midlist[mid_index]='\0';//判断那个位置之前是否为空,若非空,说明当前节点有左子树,继续递归创建左子树if(midlist[mid_index-1]!='\0'){create_tree(&((*root)->l),prelist,midlist);}//否则的话就将当前节点的左孩子置为空else{(*root)->l = NULL ;}//若当前节点有右孩子,递归创建if(midlist[mid_index+1]!='\0'){create_tree(&((*root)->r),prelist,&midlist[mid_index+1]);}else{(*root)->r = NULL ;}
}
//根据传进来的中序首元素节点,在中序序列中找该结点下标。
int findIndex(char pre,char * mid){ int i ;for(i = 0; *(mid+i)!= '\0' ;i++){if(pre == *(mid+i)){return i ;}}return 0;
}
根据后序和中序创建二叉树时同样的道理,自己在这个基础上尝试找一些规律,就可以自己恢复了。
后序和中序
#include<stdlib.h>
#include<iostream>
#include<string.h>
using namespace std;
typedef struct node{char ch ;struct node * l,*r ;
}node_t,*node_l;void create_tree(node_l * root,char lastlist[],char midlist[]);
int findIndex(char last,char* midlist);
void print(node_l root);
int main(){node_l root ;char lastlist[100];char midlist[100];bzero(lastlist,sizeof(lastlist));bzero(midlist,sizeof(midlist));cin>>midlist;cin>>lastlist;create_tree(&root,lastlist,midlist);print(root);
}
void print(node_l root){if(root){cout<<root->ch<<"";print(root->l);print(root->r);}
}
void create_tree(node_l* root,char lastlist[],char midlist[]){static int index = strlen(lastlist)-1;int mid_index ; mid_index = findIndex(lastlist[index],midlist);*root = (node_l)malloc(sizeof(node_t));(*root)->ch = lastlist[index];lastlist[index--]='\0' ;if(index==-1)return ;midlist[mid_index]='\0';if(midlist[mid_index+1]!='\0'){create_tree(&((*root)->r),lastlist,&midlist[mid_index+1]);}else{(*root)->r = NULL ;}if(midlist[mid_index-1]!='\0'){create_tree(&((*root)->l),lastlist,midlist);}else{(*root)->l = NULL ;}
}int findIndex(char last,char * mid){int i ;for(i = 0; *(mid+i)!= '\0' ;i++){if(last == *(mid+i)){return i ;}}return 0;
}
根据先序和中序(中序和后序)确定二叉树相关推荐
- Algorithm Gossip (22) 中序式转后序式(前序式)
前言 This Series aritcles are all based on the book <经典算法大全>; 对于该书的所有案例进行一个探究和拓展,并且用python和C++进行 ...
- 二叉树 -php实现先序、中序、后序遍历二叉树
二叉树是每个节点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查 ...
- 【编程】二叉树的先序、中序、后序遍历
二叉树的遍历主要有三种: 先序遍历(根左右) 中序遍历(左根右) 后序遍历(左右根) 举个例子: 先(根)序遍历(根左右):A B D H E I C F J K G 中(根)序遍历(左根右):D H ...
- 树节点的遍历,查找,删除(前序,中序,后序)
二叉树模板类: class BinaryTree {private Node root;public void setRoot(Node root) {this.root = root;}//删除结点 ...
- 二叉树的建立以及先序、中序、后序遍历C语言实现---【递归方式】
下图的二叉树作为测试例,输出前中后三种遍历方式下的结果. 先序遍历: A B D C 中序遍历: B D A C 后序遍历: D B C A #include "stdio.h" ...
- 二叉树的前中后序遍历之迭代法(非统一风格迭代方式)
文章目录 前言 一.前序遍历(迭代法) 二.中序遍历(迭代法) 三.后序遍历(迭代法) 总结 前言 「递归的实现就是:每一次递归调用都会把函数的局部变量.参数值和返回地址等压入调用栈中」,然后递归返回 ...
- 已知二叉树先序和中序遍历结果,求后序遍历结果
以下面的例题为例进行讲解:已知一棵二叉树的先序遍历序列和中序遍历序列分别是ABDCEF.BDAECF,求二叉树及后序遍历序列. 分析:先序遍历序列的第一个字符为根结点.对于中序遍历,根结点在中序遍历序 ...
- 二叉树的遍历:先序 中序 后序遍历的递归与非递归实现及层序遍历
二叉树的定义:一种基本的数据结构,是一种每个节点的儿子数目都不多于2的树 树节点的定义如下: // 树(节点)定义 struct TreeNode {int data; // 值TreeNode* l ...
- 二叉树的前中后序查找+思路分析
思路分析 代码实现 package com.atguigu.tree;/*** @创建人 wdl* @创建时间 2021/3/24* @描述*/ public class BinaryTreeDemo ...
- [Leedcode][JAVA][第94/144/145题][前中后序遍历][递归][迭代][二叉树]
[问题描述][] 前序遍历 先输出当前结点的数据,再依次遍历输出左结点和右结点 中序遍历 先遍历输出左结点,再输出当前结点的数据,再遍历输出右结点 后续遍历 先遍历输出左结点,再遍历输出右结点,最后输 ...
最新文章
- Linux SVN命令详解
- springboot 做表白墙_学校表白墙有多羞耻??!辣眼分析数千条表白内容,原来脱单秘密在这里.......
- 光流 | MATLAB实现HS Optical Flow(代码类)
- 在矩池云中保存Conda环境
- java入门简单小项目_JAVA入门_java项目接入Mysql8.0
- 用gambit学博弈论--完全信息动态博弈(一)
- jieba java_【NLP】【一】中文分词之jieba
- 基于Keil 5编写汇编程序
- Zigbee和WiFi的信道重叠
- 【JAVA SE基础篇】24.包的机制和import详解
- 怎么用一个计算机控制两个屏幕,一台电脑控制多个led显示屏
- Java必突-JVM知识专题(一): Java代码是如何跑起来的+类加载到使用的过程+类从加载到使用核心阶段(类初始化)+类加载的层级结构+什么是JVM的内存区域划分?Java虚拟机栈、Java堆内存
- 【畅购商城】购物车模块之添加购物车
- Word 2016 及以上版本如何设置分别自动插入可以链接到正文的图目录和表目录
- 【接口调用】EasyCVR获取直播流接口调用过程
- visual studio常用插件
- 用“分区助手”(PartAssist)给C盘扩容
- studio 3T 破解方法(亲测)
- 问卷星自动填写,智能验证和滑动块
- Codeforces Round #663 (Div. 2) A-D