二叉树的性质与存储(C/C++ 严蔚敏版)

二叉树的相关性质: 

 

 

二叉树的存储结构

 顺序存储方式(数组)

 二叉树的链式存储:

 有时候我们需要经常找前驱节点,因此可以在添加一个指向前驱节点的指针,构成三叉树

现在我们尝试实现二叉树的遍历

 上代码

#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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值