数据结构课程学了二叉树,觉得自己大概理解了,但是实现还是总有困难,尤其是结构体指针这块,吃了不少亏
(一)存储与遍历(递归)
#include<algorithm>
#include<cstdlib>
#include<cstdio>
#include<queue>
#include<stack>
using namespace std;
typedef struct BiTNode{ //定义结构体,包含数据域、左右子节点指针
int data;
BiTNode *lchild,*rchild;
}BiTNode,*BiTree; //定义一个BiTNode类型的结构体变量与结构体指针
//建立二叉树
void createBiTree(BiTree* t){ //此处必须为指针类型
int ch;
scanf("%d",&ch);
if(ch==-1){ //节点值输入为"-1"时,表示该节点没有左(右)叶节点
*t=NULL;
}
else{
*t=(BiTree)malloc(sizeof(BiTNode)); //开辟一块BiTree指针类型的空间
(*t)->data=ch;
printf("请输入%d的左子节点值:",ch);
createBiTree(&(*t)->lchild); //对地址进行操作,注意此格式
printf("请输入%d的右子节点值:",ch);
createBiTree(&(*t)->rchild);
}
}
//先序遍历(递归实现)
void PreOrderTraverse(BiTree t){
if(t==NULL)
return;
else{
printf("%d",t->data);
PreOrderTraverse(t->lchild);
PreOrderTraverse(t->rchild);
}
}
//中序遍历(递归实现)
void InOrderTraverse(BiTree t){
if(t==NULL)
return;
else{
InOrderTraverse(t->lchild);
printf("%d",t->data);
InOrderTraverse(t->rchild);
}
}
//后序遍历(非递归)
void PostOrderTraverse(BiTree t){
if(t==NULL)
return;
else{
PostOrderTraverse(t->lchild);
PostOrderTraverse(t->rchild);
printf("%d",t->data);
}
}
//求树深度
int deepth(BiTree t){
int deep=0;
int ldeepth,rdeepth;
if(t){
ldeepth=deepth(t->lchild);
rdeepth=deepth(t->rchild);
deep=ldeepth>=rdeepth?ldeepth+1:rdeepth+1;
}
return deep;
}
//交换左右子树(递归实现