二叉树的创建
采用二叉链表存储二叉树,利用两种算法创建二叉树:
①前序遍历的思想创建二叉树,
②输入二叉树的前序和中序遍历序列,创建二叉树。并使用中序遍历算法和层次遍历算法遍历二叉树。(二叉树的结点数据采用英文字母即可
//前序遍历建树
#include<bits/stdc++.h>
using namespace std;
typedef struct BNode{
char data;
struct BNode *left;
struct BNode *right;
}BNode;
char str[110]; //存放输入的前序遍历字符串
int i;
BNode *creat(){
if(str[i] == '#'){ //空结点
i++;
return NULL;
}
else{
//新建一个结点
BNode *root = (BNode *)malloc(sizeof(BNode));
root->data = str[i];
//初始化左右节点
root->left = NULL;
root->right = NULL;
i++;
root->left = creat();
root->right = creat();
return root;
}
}
//前序遍历
void reach(BNode *root){
if(!root)
return ;
cout<<root->data<<" ";
reach(root->left);
reach(root->right);
}
int main(){
// 样例:124##56##7##3##
// 前序遍历结果为: 1 2 4 5 6 7 3
printf("输入数据:");
cin>>str;
i = 0;
BNode *root = creat();
printf("前序遍历:");
reach(root);
return 0;
}
#include<bits/stdc++.h>
#define Size 100 //字符串最大长度
using namespace std;
typedef struct BinTreeNode* BinTree;
struct BinTreeNode
{
char element;
BinTree leftchild;//左子树
BinTree rightchild;//右子树
};
BinTree CreateTree_Pre(char* preOrder, char* midOrder, int n) //这里传的是数组的指针(理解成初始位置);
{
BinTree tree = (BinTree)malloc(sizeof(struct BinTreeNode));
tree->element = preOrder[0];//初始化节点
tree->leftchild = NULL;
tree->rightchild = NULL;
if (n == 1||n == 0) //只剩下一个结点时,直接返回
return tree;
int midPtr=0, leftLength, rightLength;
while (midOrder[midPtr] != preOrder[0]) //找出中序遍历中根节点的位置
{
midPtr++;
}
leftLength = midPtr; //左子树结点数
rightLength = n - leftLength - 1; //右子树结点数
//直接引用原数组,利用指针。
tree->leftchild = CreateTree_Pre(&preOrder[1], midOrder, leftLength);
tree->rightchild = CreateTree_Pre(&preOrder[leftLength + 1], &midOrder[leftLength + 1], rightLength);
return tree;
}
void PrintPostOrder(BinTree t) //打印后序遍历结果
{
if (!t)
return;
PrintPostOrder(t->leftchild);
printf("%c", t->element);
PrintPostOrder(t->rightchild);
}
void PrintLevelOeder(BinTree t){ //用队列操作
if(!t){
return ;
}
queue<BinTree>q; //建立队列
q.push(t);
while(!q.empty()){
BinTree p;
p = q.front();
cout<<p->element;
if(p->leftchild!=NULL){
q.push(p->leftchild);
}
if(p->rightchild!=NULL){
q.push(p->rightchild);
}
q.pop();
}
}
int main()
{
//测试数据
//先序遍历:abdecfg
//中序遍历:dbeafcg
BinTree t = (BinTree)malloc(sizeof(struct BinTreeNode));
char pre[Size], mid[Size];
printf("请输入先序遍历结果:");
gets(pre);
printf("请输入中序遍历结果:");
gets(mid);
//建树
int n = strlen(pre);
t = CreateTree_Pre(pre, mid, n);
printf("中序遍历结果为:");
PrintPostOrder(t);
printf("\n层次遍历结果为:");
PrintLevelOeder(t);
return 0;
}