二叉树的相关性质:
二叉树的存储结构
顺序存储方式(数组)
二叉树的链式存储:
有时候我们需要经常找前驱节点,因此可以在添加一个指向前驱节点的指针,构成三叉树
现在我们尝试实现二叉树的遍历
上代码
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
using namespace std;
#define MAXSIZE 100
/*二叉树的顺序存储
typedef struct Bisqtree{
int a[MAXSIZE];//这里定义数组内存储的元素是int型数据
int p;//数组指针
}BisqTree; */
//二叉树的链式存储结构
typedef struct BiNode{
int data;
struct BiNode *lchild,*rchild;//定义左右子树指针
struct BoNode *parent;//指向前驱结点
}Tree,*BitTree;
//构造二叉树
BitTree creatlink(){
int data;
BitTree T;
int temp;
scanf("%d",&data);
temp=getchar();//吸收空格,如输入12 13 14 15可以是scanf读到这几个数而不会因读到空格而停止
if(data==-1){//data为-1则说明该节点不存在
return NULL;
}else{//递归思想
T=(BitTree)malloc(sizeof(Tree));
T->data=data;
printf("请输入%d的左子树: \n",data);
T->lchild=creatlink();
printf("请输入%d的右子树: \n",data);
T->rchild=creatlink();
return T;
}
}
//遍历二叉树
//1.先序遍历
void showxianxu(BitTree T){
if(T==NULL){
return;//如果该节点不存在,则返回上一节点
}else{
printf("%d ",T->data);
showxianxu(T->lchild);
showxianxu(T->rchild);
}
}
//4.分层遍历二叉树
//1。首先定义用于储存二叉树的队列
typedef struct {
Tree data[100];
int front,rear;//头指针与尾指针
}SqQueue;
//复制二叉树
int copy(BitTree T,BitTree&NewT){
if(T==NULL){
NewT==NULL;
}else{
NewT=(BitTree)malloc(sizeof(Tree));
NewT->data=T->data;
copy(NewT->lchild,NewT->lchild);
copy(NewT->rchild,NewT->rchild);
}
}
//计算二叉树深度
int Depth(BitTree T){
if(T==NULL) return 0;
else{
m=Depth(T->lchild);
n=Depth(T->rchild);
if(m>n)return m+1;
else return n+1;
}
}
//计算二叉树的结点数
int nodenum(BitTree T){
if(T==NULL)return 0;
else{
m=nodenum(T->lchild);
n=nodenum(T->rchild);
return m+n+1;
}
} //计算叶子结点数
int LeadCount(BitTree T){
if(T==NULL)return 0;
if(T->lchild==NULL&&T->rchild==NULL){
return 1;
}else return LeafCount(T->lchild)+LeafCount(T->rchild);
}
//搜索二叉树
int main(){
BitTree T;
T=creatlink();
showxianxu(T);
return 0;
}