二叉树的创建:根据前序中序、中序后序递归创建二叉树
程序员文章站
2022-04-21 23:27:18
...
根据如图创建二叉树:
先序遍历为: "A B C D E F G H"
中序遍历为: "C B E D F A G H"
后序遍历为: "C E F D B H G A"
代码如 下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h> // memset;
#include<iostream>
using namespace std;
typedef char ElemType;
typedef struct BtNode //创建二叉树
{
BtNode *leftchild;
BtNode *rightchild;
ElemType data;
}BtNode, *BinaryTree;
BtNode * Buynode() //申请结点
{
BtNode *s = ( BtNode*)malloc(sizeof(BtNode));
if(NULL == s) exit(1);
memset(s,0,sizeof(BtNode));
return s;
}
void Freenode(BtNode *p)
{
free(p);
}
void PreOrder(BtNode *p) //先序
{
if(p != NULL)
{
printf("%c ",p->data);
PreOrder(p->leftchild);
PreOrder(p->rightchild);
}
}
void InOrder(BtNode *p) //中序
{
if(p != NULL)
{
InOrder(p->leftchild);
printf("%c ",p->data);
InOrder(p->rightchild);
}
}
void PastOrder(BtNode *p) //后序
{
if(p != NULL)
{
PastOrder(p->leftchild);
PastOrder(p->rightchild);
printf("%c ",p->data);
}
}
int FindIndex(const ElemType *istr,int n,ElemType x) //找下标
{
int pos = -1;
for(int i = 0;i<n;++i)
{
if(istr[i] == x)
{
pos = i;
break;
}
}
return pos; // -1;
}
BtNode * CreatePI(const ElemType *pstr,const ElemType *istr,int n)//先序中序创建
{
struct BtNode *s = NULL;
if(n > 0)
{
s = Buynode();
s->data = *pstr;
int pos = FindIndex(istr,n,*pstr);
if(-1 == pos) exit(1);
s->leftchild = CreatePI(pstr+1,istr,pos);
s->rightchild = CreatePI(pstr+1+pos,istr+1+pos,n-pos-1);
}
return s;
}
BtNode * CreateTreePI(const ElemType *pstr,const ElemType *istr,int n)//先序中序创建
{
if(NULL == pstr || NULL == istr || n < 1) return NULL;
return CreatePI(pstr,istr,n);
}
struct BtNode * CreateIL(const ElemType *istr,const ElemType *lstr,int n)//中序后序创建
{
struct BtNode *s = NULL;
if(n > 0)
{
s = Buynode();
s->data = lstr[n-1]; // *(lstr+n-1);
int pos = FindIndex(istr,n,lstr[n-1]);
if(-1 == pos) exit(1);
s->leftchild = CreateIL(istr,lstr,pos);
s->rightchild = CreateIL(istr + pos + 1,lstr + pos,n - pos -1);
}
return s;
}
struct BtNode * CreateTreeIL(const ElemType *istr,const ElemType *lstr,int n)//中序后序创建
{
if(NULL == istr || NULL == lstr || n < 1) return NULL;
return CreateIL(istr,lstr,n);
}
int main()
{
char *pstr = "ABCDEFGH";
char *istr = "CBEDFAGH";
char *lstr = "CEFDBHGA";
int n = strlen(pstr);
BinaryTree root = CreateTreePI(pstr,istr,n);
//BinaryTree root = CreateTreeIL(istr,lstr,n);
PreOrder(root); printf("\n");
InOrder(root); printf("\n");
PastOrder(root); printf("\n");
return 0;
}
运行结果:
上一篇: 爆笑,熊孩子被揍成重伤了
下一篇: 丑数:求第n个丑数
推荐阅读
-
Python利用前序和中序遍历结果重建二叉树的方法
-
Python实现输入二叉树的先序和中序遍历,再输出后序遍历操作示例
-
PHP实现二叉树深度优先遍历(前序、中序、后序)和广度优先遍历(层次)实例详解
-
[PHP] 算法-根据前序和中序遍历结果重建二叉树的PHP实现
-
c/c++ 用前序和中序,或者中序和后序,创建二叉树
-
Python实现二叉树前序、中序、后序及层次遍历示例代码
-
【算法】二叉树的前序、中序、后序、层序遍历和还原。
-
PHP基于非递归算法实现先序、中序及后序遍历二叉树操作示例
-
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
-
剑指 Offer 07. 重建二叉树——【前中序】和【中后序】重建二叉树的递归思路详解