知识了解二叉树的一些性质,缺乏对二叉树的操作,在这里就写一个二叉树的基本操作,熟悉熟悉二叉树。我认为最难的是层序遍历吧。比较难写一点。
代码如下:
//二叉树的结构
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
typedef char ElemType;
struct BTreeNode{
ElemType date;
BTreeNode*left;
BTreeNode*right;
};
void InitBTree(BTreeNode*& BT){
BT=NULL;
}
void CreateBTree(BTreeNode*&BT , char*a){
const int MaxSize = 10;
BTreeNode*s[MaxSize]; //s作为存储根结点指针的栈使用
int top = -1; //topz作为栈顶指针,初值为-1,表示栈空;
BT = NULL; //把树根置为空,即从空树开始
BTreeNode*p; //定义P为指向二叉树节点的指针
int k; //用k处理节点的左子树和右子树
int i = 0;
while(a[i]){
switch(a[i]){
case ' ':
break;
case '(':
if(top == MaxSize - 1){
cout<<"栈空间太小,请增加MaxSize的值!"<<endl;
exit(1);
}
top++;
s[top] = p;
k = 1;
break;
case ')':
if(top == -1){
cout<<"二叉树广义表字符串错"<<endl;
exit(1);
}
top --;
break;
case ',':
k = 2;
break;
default:
p = new BTreeNode;
p->date= a[i];
p->left = p->right = NULL;
if(BT == NULL) BT = p;
else {
if(k == 1) s[top]->left = p;
else s[top]->right = p;
}
}
i++;
}
}
bool EmptyBTree(BTreeNode*BT){
return BT == NULL;
}
int DepthBTree(BTreeNode *BT){
if(BT == NULL){
return 0;
}else {
int dep1 = DepthBTree(BT->left);
int dep2 = DepthBTree(BT->right);
if(dep1>dep2)return dep1 + 1;
else return dep2 + 1;
}
}
bool FindBTree(BTreeNode*BT,ElemType &x){
if(BT == NULL){
return false;
} else {
if(BT->date == x){
x = BT->date;
return true;
}
else {
if(FindBTree(BT->left,x))return true;
if(FindBTree(BT->right,x))return true;
return false;
}
}
}
void ClearBTree(BTreeNode*&BT){
if(BT!=NULL){
ClearBTree(BT->left);
ClearBTree(BT->right);
delete BT;
BT = NULL;
}
}
void PrintBTree(BTreeNode*BT){
if(BT!=NULL){
cout<<BT->date;
if(BT->left!=NULL||BT->right!=NULL){
cout<<'(';
PrintBTree(BT->left);
if(BT->right!=NULL){
cout<<',';
}
PrintBTree(BT->right);
cout<<')';
}
}
}
void PreOrder(BTreeNode* BT){
if(BT!=NULL){
cout<<BT->date<<" ";
PreOrder(BT->left);
PreOrder(BT->right);
}
}
void InOrder(BTreeNode* BT){
if(BT!=NULL){
InOrder(BT->left);
cout<<BT->date<<" ";
InOrder(BT->right);
}
}
void PostOrder(BTreeNode* BT){
if(BT!=NULL){
PostOrder(BT->left);
PostOrder(BT->right);
cout<<BT->date<<" ";
}
}
void LeveOrder(BTreeNode*BT){
const int MaxSize = 30;
BTreeNode* q[MaxSize];
int front = 0;
int rear = 0;
BTreeNode*p;
if(BT!=NULL){
rear = (rear + 1)%MaxSize;
q[rear] = BT;
}
while(front != rear){
front = (front + 1)%MaxSize;
p = q[front];
cout<<p->date<<" ";
if(p->left != NULL){
rear = (rear + 1)%MaxSize;
q[rear] = p->left;
}
if(p->right != NULL){
rear = (rear+1)%MaxSize;
q[rear] = p->right;
}
}
}
int main()
{
BTreeNode*bt;
InitBTree(bt);
char b[50];//定义一个用于存放二叉树广义表的字符数组
cout<<"输入二叉树用广义表表示的字符串:"<<endl;
cin.getline(b,sizeof(b));
cout<<"dfht"<<endl;
CreateBTree(bt,b);
PrintBTree(bt);
cout<<endl;
cout<<"前序遍历: "<<endl;
PreOrder(bt);
cout<<endl;
cout<<"中序遍历: "<<endl;
InOrder(bt);
cout<<endl;
cout<<"后序遍历: "<<endl;
PostOrder(bt);
cout<<endl;
cout<<"层序遍历: "<<endl;
LeveOrder(bt);
cout<<endl;
return 0;}
这是一个非常非常大的世界,这个世界上生活着很多很多的人,一生中遇到的人里有几个等留下难忘的记忆?
我还这是个年轻人,没有那么多的故事和经验,对于世界的本质有着强烈的好奇。希望在以后的日子里,自己可以变得更好,
希望大家也越来越强大。