一、根据先序遍历和中序遍历创建二叉树
1、根据中序遍历的结果能确定一棵树吗?
中序遍历:结果为:“12345”,这个“12345”能确定一棵树吗?
请思考,会有多少种形状。2、如何才能确定一棵树?
结论:
通过中序遍历和先序遍历可以确定一个树
通过中序遍历和后续遍历可以确定一个树
通过先序遍历和后序遍历确定不了一个树。
单独先序遍历:能求解根,但不能求解左子树什么时候结束、右子树什么时候开始。
3、根据先序和中序结果画树
算法
1、通过先序遍历找到根结点A,再通过A在中序遍历的位置找出左子树,右子树
2、在A的左子树中,找左子树的根结点(在先序中找),转步骤13、在A的右子树中,找右子树的根结点(在先序中找),转步骤1
二、#号法创建二叉树
1、什么是#号法创建树
#创建树,让树的每一个节点都变成度数为2的树
先序遍历:124###3## 可以唯一确定一棵树吗,为什么?
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
using namespace std;
//第一种表示方法 :二叉链表示法
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);
}
//先序创建二叉树
BiTNode* createBiTree()
{
BiTNode*node = NULL;
char h;
scanf("%c",&h);
if (h=='#')
{
return NULL;
}
else
{
node = (BiTNode*)malloc(sizeof(BiTNode));
if (node==NULL)
{
return NULL;
}
memset(node,0,sizeof(BiTNode));
node->data = h;
node->lchild = createBiTree();
node->rchild = createBiTree();
}
return node;
}
//后续遍历销毁二叉树
void freeTree(BiTNode* root)
{
if (root!=NULL)
{
if (root->lchild)
{
freeTree(root->lchild);
root->lchild = NULL;
}
if (root->rchild)
{
freeTree(root->rchild);
root->rchild = NULL;
}
if (root!=NULL)
{
free(root);
root=NULL;
}
}
}
int main()
{
BiTNode *root;
printf("请先按先序输入二叉树<如:ABDH#K###E##CFI###G#J##>以回车键表示输入结束\n");
root = createBiTree();
//先序遍历二叉树
printf("\n先序遍历二叉树\n");
preOrder(root);
freeTree(root);
system("pause");
return 0;
}
输入序列124###3##(其中的“#”表示空,并且输入过程中不要加回车,因为回车也有对应的ASCII码,是要算字符的,但是输入 完之后可以按回车退出),这时候就能够看到结果了。 另外你必须会手动建立一棵二叉树,保证你输入的序列能构成一棵二叉树,否则你怎么输入,按最后按多少回车程序也不会结束!