【二叉树】二叉搜索树与完全二叉树的创建和操作

本文介绍了二叉树的概念,包括空树、单支树和满树形态。重点讲解了二叉搜索树的定义及创建,强调左子女值小于等于根节点,右子女值大于等于根节点。接着讨论了完全二叉树的特征,即前h-1层满,第h层可能缺失右子女。通过代码展示了创建完全二叉树和二叉搜索树的方法。此外,还详细阐述了二叉树的前序、中序、后序递归遍历以及非递归按层遍历的实现,包括前序、中序非递归遍历。同时提到了其他二叉树的递归操作,如计算叶子节点个数、树的深度和查找关键字节点等。
摘要由CSDN通过智能技术生成

二叉树
概念:度最大为二的树
形态:空树;只有根节点;只有左子女;只有右子女;既有左子女,也有右子女。

【表示】: 
1. 二元组表示:<前驱,后继>   序偶:尖括号表示一对节点
    eg:DATA={A,B,C,D,E,F,G,H,I}  
    BR={
  <A,B>,<A,C>,<B,D>,<B,E>,<C,F>,<E,G>,<E,H>,<F,I>}
2. 广义表示法: 双亲(左子女,右子女)       
    eg:  DATA={A,B,C,D,E,F,G,H,I}               
    A(B(D,E(D,H)),C(  ,F( I ))) 【若缺失左子女,逗号不可省略】 
【二叉树的性质】:
    ①:叶子节点总比双分支节点个数多一
    ②:将一棵满二叉树按层进行编号,层数设为i,则每一层都有 2^(i-1)个节点,一棵h层的二叉树有(2^h -1)个节点。

创建二叉搜索树:

二叉搜索树:左子女的数据域值小于或等于根节点的数据域值,右子女的数据域值大于或等于根节点的值
节点类型:[左子女节点地址]<-[节点数据]->[右子女节点地址]
则有:
typedef struct node{
int data;
struct node* left;
struct node* right;
}BTnode;


代码如下——>

/*通过已有数组元素创建二叉搜索树  
先为root分配单元,将数组中的第一个元素放置在root->data 上,然后遍历数组其他元素
用指针c 在二叉树上跑,指针pa 跟在c 的后面,当要插入的元素比 c 大时,c 往右边跑,反之往左边跑
c 为空时停下来,pa 指在待被插结点上,然后判断待插结点p 与 pa 的大小,小的插在左边,大的插在右边
结束后返回根节点root ,二叉搜索树创建完成                                                    */
BTnode* BtSearchTree::CreateBtSearchTree(int a[]){
    BTnode * root , *p, *pa, *c ;
    int i;
    root=(BTnode *)malloc(sizeof(BTnode));
    root->data = a[0];
    root->left= root->right= NULL;
    for(i=1; i<N; i++){
        p=(BTnode *)malloc(sizeof(BTnode));
        p->data= a[i];
        p->left=p->right= NULL;
        c= root;
        while(c){
            pa= c;
            if(c->data< p->data) 
                c= c->right;
            else 
                c= c->left;
        }
        if(pa->data > p->data)
            pa->left= p;
        else 
            pa->right= p;
    }
    return root;
}

创建完全二叉树:

完全二叉树:
一棵h层的二叉树,前h-1 层是满的,第h层连续缺失右边子女
i.满二叉树是特殊的完全二叉树
ii.完全二叉树最多只有一个单分支
iii.一棵h层的完全二叉树有n个节点,则:

        (n<=2^h-1)&&(n>2^(h-1)-1)==>2^(h-1)<n+1<=2^h
         h-1<log2(n+1)<=h

代码如下——>


#define N 8

typedef struct node{
        int data;                         
        struct node* left;          
        struct node* right;
    }BTnode;
/*使用队列 创建完全二叉树;由完全二叉树的性质可知,使用顺序存储满足完全二叉树的存储特点,便采用队列*/

BTnode * CreateCompleteBiTree(int a[]){
    BTnode **Q, *pa, *p, *root;
    Q=(BTnode **)malloc(N*sizeof(BTnode *));        //给队列Q 分配单元
    int front,rear;
    front= rear = 0;                                //初始化
    int i;
    root= (BTnode *)malloc(sizeof(BTnode));         //初始化根节点
    root->data= a[0];
    root->left= root->right= NULL;
    pa= root;                                       //使pa 指向根节点
    for(i= 1; i<N; i++){                            //对a[1]~a[N]的数据进行遍历,最终完成完全二叉树的遍历
        p= (BTnode *)malloc(sizeof(BTnode));
        p->data= a[i];
        p->left= p->right = NULL;
        if(!pa->left   )                            //如果待插结点pa 左空, p插在左边
            pa->left =p;
        else{                                       //左不空,右空,p插在右边
            pa->right= p;
            pa= Q[++front];                         //pa 出队
        }
        Q[++rear]= p;                               //p  入队
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值