转载-根据先序序列和中序序列创建二叉树
来源:互联网 发布:海量数据下载 编辑:程序博客网 时间:2024/05/21 17:38
出处:http://blog.csdn.net/bbs375/article/details/52745107
结论: 通过中序遍历和先序遍历可以确定一个树
通过中序遍历和后续遍历可以确定一个树
通过先序遍历和后序遍历确定不了一个树。
单独先序遍历:能求解根,但不能求解左子树什么时候结束、右子树什么时候开始。
根据先序和中序结果画树
算法1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树
2、在A的左子树中,找左子树的根结点(在先序中找),转步骤1
3、在A的右子树中,找右子树的根结点(在先序中找),转步骤1
根据如下遍历结果创建二叉树:
先序遍历结果:ABDHKECFIGJ
中序遍历结果:HKDBEAIFCGJ
- #define _CRT_SECURE_NO_WARNINGS
- #include <stdlib.h>
- #include<stdio.h>
- #include <string.h>
- #define N 100
- typedef struct BiTNode
- {
- char data;
- struct BiTNode *lchild,*rchild;
- } BiTNode,* BITree;
- //先序遍历
- void preOrder(BiTNode*root)
- {
- if (root==NULL)
- {
- return;
- }
- printf(”%c ”,root->data);
- preOrder(root->lchild);
- preOrder(root->rchild);
- }
- //中序遍历
- void inOrder(BiTNode*root)
- {
- if (root==NULL)
- {
- return;
- }
- inOrder(root->lchild);
- printf(”%c ”,root->data);
- inOrder(root->rchild);
- }
- /************************************************************************/
- /* 算法
- 1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树
- 2、在A的左子树中,找左子树的根结点(在先序中找),转步骤1
- 3、在A的右子树中,找右子树的根结点(在先序中找),转步骤1 */
- /************************************************************************/
- //根据先序遍历和中序遍历创建二叉树
- BiTNode* createBiTree(char *pre, char *in, int n)
- {
- int i = 0;
- int n1 = 0,n2 = 0;
- int m1 = 0,m2 = 0;
- BiTNode*node = NULL;
- char lpre[N],rpre[N];
- char lin[N],rin[N];
- if (n == 0)
- {
- return NULL;
- }
- node = (BiTNode*)malloc(sizeof(BiTNode));
- if (node==NULL)
- {
- return NULL;
- }
- memset(node,0,sizeof(BiTNode));
- //先序序列的第一个元素必为根结点
- node->data = pre[0];
- //根据根结点将中序序列分为左子树和右子数
- for (i = 0;i<n;i++)
- {
- if ((i<=n1)&&(in[i]!=pre[0]))
- {
- lin[n1++] = in[i];
- }
- else if(in[i]!=pre[0])
- {
- rin[n2++] = in[i];
- }
- }
- //根据树的先序序列的长度等于中序序列的长度
- //且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的
- //主意 从i=1开始 因为先序遍历的第一个是根
- for (i = 1;i < n;i++)
- {
- if (i< (n1+1))//n1代表了左子树的长度
- {
- lpre[m1++] = pre[i];
- }
- else
- {
- rpre[m2++] = pre[i];
- }
- }
- node->lchild = createBiTree(lpre,lin,n1);
- node->rchild = createBiTree(rpre,rin,n2);
- return node;
- }
- int main()
- {
- char preNode[N];
- char inNode[N];
- int n = 0;
- char ch;
- BiTNode* root=NULL;
- printf(”请输入先序序列\n”);
- while((ch = getchar())&&ch!=‘\n’)
- preNode[n++] = ch;
- printf(”请输入中序序列\n”);
- n = 0;
- while((ch = getchar())&&ch!=‘\n’)
- inNode[n++] = ch;
- root = createBiTree(preNode,inNode,n);
- printf(”先序序列\n”);
- preOrder(root);
- printf(”\n中序序列\n”);
- inOrder(root);
- system(”pause”);
- return 0;
- }
#define _CRT_SECURE_NO_WARNINGS
include <stdlib.h>
include<stdio.h>
include <string.h>
define N 100
typedef struct BiTNode
{
char data;
struct BiTNode *lchild,*rchild;
} BiTNode,* BITree;
//先序遍历
void preOrder(BiTNode*root)
{
if (root==NULL)
{
return;
}
printf("%c ",root->data);
preOrder(root->lchild);
preOrder(root->rchild);
}
//中序遍历
void inOrder(BiTNode*root)
{
if (root==NULL)
{
return;
}
inOrder(root->lchild);
printf("%c ",root->data);
inOrder(root->rchild);
}
/**************************************************************/
/* 算法
1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树
2、在A的左子树中,找左子树的根结点(在先序中找),转步骤1
3、在A的右子树中,找右子树的根结点(在先序中找),转步骤1 */
/**************************************************************/
//根据先序遍历和中序遍历创建二叉树
BiTNode* createBiTree(char *pre, char *in, int n)
{
int i = 0;
int n1 = 0,n2 = 0;
int m1 = 0,m2 = 0;
BiTNode*node = NULL;
char lpre[N],rpre[N];
char lin[N],rin[N];
if (n == 0)
{
return NULL;
}
node = (BiTNode*)malloc(sizeof(BiTNode));
if (node==NULL)
{
return NULL;
}
memset(node,0,sizeof(BiTNode));
//先序序列的第一个元素必为根结点
node->data = pre[0];
//根据根结点将中序序列分为左子树和右子数
for (i = 0;i<n;i++)
{
if ((i<=n1)&&(in[i]!=pre[0]))
{
lin[n1++] = in[i];
}
else if(in[i]!=pre[0])
{
rin[n2++] = in[i];
}
}
//根据树的先序序列的长度等于中序序列的长度
//且先序遍历是先左子树再后子树,无论先序还是中序 左子树和右子树的长度都是固定的
//主意 从i=1开始 因为先序遍历的第一个是根
for (i = 1;i < n;i++)
{
if (i< (n1+1))//n1代表了左子树的长度
{
lpre[m1++] = pre[i];
}
else
{
rpre[m2++] = pre[i];
}
}
node->lchild = createBiTree(lpre,lin,n1);
node->rchild = createBiTree(rpre,rin,n2);
return node;
}
int main()
{
char preNode[N];
char inNode[N];
int n = 0;
char ch;
BiTNode* root=NULL;
printf(“请输入先序序列\n”);
while((ch = getchar())&&ch!=’\n’)
preNode[n++] = ch;
printf(“请输入中序序列\n”);
n = 0;
while((ch = getchar())&&ch!=’\n’)
inNode[n++] = ch;
root = createBiTree(preNode,inNode,n);
printf("先序序列\n");preOrder(root);printf("\n中序序列\n");inOrder(root);system("pause");return 0;
}
- 转载-根据先序序列和中序序列创建二叉树
- 根据先序序列和中序序列创建二叉树
- 根据先序和中序序列求二叉树
- 根据二叉树的先序序列和中序序列还原二叉树并打印后序序列
- 根据先序序列和中序序列构造二叉树
- 根据先序序列和中序序列重建二叉树
- 根据先序遍历序列和中序遍历序列重建二叉树
- 已知先序序列、中序序列创建二叉树
- 根据二叉树的先序和中序序列画出二叉树的方法
- 根据先根序列创建二叉树
- 二叉树:根据二叉树的先序遍历序列和中序遍历序列,输出该二叉树的后序遍历序列
- 二叉树遍历 ,根据先序和中序遍历序列建树
- 根据前序遍历序列和中序遍历序列创建二叉树
- 算法进化历程之“根据二叉树的先序和中序序列输出后序序列”
- 【LeetCode】Construct Binary Tree from Preorder and Inorder Traversal 根据先序序列和中序序列恢复二叉树
- 第4章第1节练习题13 根据先序序列和中序序列建立二叉树
- 递归创建先序序列二叉树
- 《剑指offer》根据先序序列与中序序列重建二叉树-Java
- scrapy-01:简单实列
- 最全的常用正则表达式大全——包括校验数字、字符、一些特殊的需求等等
- 第11周项目1
- Pytorch的backward()相关理解
- 11周项目2
- 转载-根据先序序列和中序序列创建二叉树
- Docker常用命令
- mfc inifile unicode mode读取方法
- AI与区块链的融合会给人类带来什么
- 检测requestlayout in layout问题
- 第14周项目1
- sqlalchemy 基本查询
- angular4 结构型指令 属性型指令总结
- JAVA API远程hbase出错org.apache.hadoop.hbase.client.RetriesExhaustedException