数据结构——二叉树的结点插入与遍历

BTree.h:

#ifndef _BTREE_H_
#define _BTREE_H_
//二叉树的结点数据类型
typedef struct _btreeNode
{
    int data;
    struct _btreeNode *lchild;            //???
    struct _btreeNode *rchild;            //指向右孩子结点的指针
}BTreeNode;

//创建二叉树的根结点,即可创建一个二叉树
typedef struct _btree
{
    BTreeNode *root;    //指向根结点的指针,代表二叉树
    int count;            //统计二叉树结点的个数
}BTree;

//创建二叉树,实际就是创建一个 BTree 结点
BTree *creatBTree();

//插入结点
//参数
//b         :二叉树
//data     :数据
//pos    :路径 0 代表左  1 代表右  路径从右往左看6:100  代表路径  左左右
//count  :步数
//flag   :挂在结点的左边还是右边  0  代表左  1代表 右
int BTree_insert(BTree *b,char data,int pos,int count,int flag);

//前序遍历
void pre_order(BTreeNode *root);
//中序遍历
void mid_order(BTreeNode *root);
//后序遍历
void last_order(BTreeNode *root);

#endif

BTree.c

#include<stdlib.h>
#include"BTree.h"
#include<assert.h>


BTree *creatBTree()
{
    //创建二叉树
    BTree *btree=(BTree *)malloc(sizeof(BTree)/sizeof(char));
    assert(btree);
    
    //对二叉树进行初始化
    btree->root=NULL;
    btree->count=0;
    
    return btree;
}

//插入新节点
int BTree_insert(BTree *b,char data,int pos,int count,int flag)
{
    assert(b);
    //创建新结点
    BTreeNode *node=(BTreeNode *)malloc(sizeof(BTreeNode)/sizeof(char));
    assert(node);
    
    //结点初始化
    node->data=data;
    node->lchild=NULL;
    node->rchild=NULL;
    
    int way;//当前要走的路
    BTreeNode *current=b->root;
    //找插入位置的父结点      pos:2        count=3
    while(count!=0)
    {
        way=pos&1;
        pos=pos>>1;
        
        if(way==0)    //往左走
            current=current->lchild;
        else            //往右走
            current=current->rchild;
        count--;
    }
    
    if(current==NULL)    //刚开始插入时
        b->root=node;    //新结点成为了新建二叉树的根结点
    else
    {
        if(flag==0)
        {
            node->lchild=current->lchild;
            current->lchild=node;
        }
        else
        {
            node->rchild=current->rchild;
            current->rchild=node;
        }
    }
    b->count++;        //结点个数加1
    return 0;
}

//前序    根左右
void pre_order(BTreeNode *root)
{
    if(root==NULL)
        return;
    printf("%-4c",root->data);
    pre_order(root->lchild);
    pre_order(root->rchild);
}

//中序    左根右
void mid_order(BTreeNode *root)
{
    if(root==NULL)
        return;
    mid_order(root->lchild);
    printf("%-4c",root->data);
    mid_order(root->rchild);
}

//后序    左右根
void last_order(BTreeNode *root)
{
    if(root==NULL)
        return;
    last_order(root->lchild);
    last_order(root->rchild);
    printf("%-4c",root->data);
}

main.c

#include<stdio.h>
#include"BTree.h"

int main()
{
    BTree *btree=creatBTree();
    
    int BTree_insert(btree,'A',0,0,0);
    int BTree_insert(btree,'B',0,0,0);
    int BTree_insert(btree,'C',1,0,1);
    int BTree_insert(btree,'D',0,1,0);
    int BTree_insert(btree,'E',0,1,1);
    int BTree_insert(btree,'F',1,1,0);
    int BTree_insert(btree,'G',1,1,1);
    int BTree_insert(btree,'H',1,2,1);
    
    pre_order(btree->root);
    printf("\n");
    mid_order(btree->root);
    printf("\n");
    last_order(btree->root);
    printf("\n");

    return 0;
    
}

猜你喜欢

转载自blog.csdn.net/kuniqiw/article/details/81131526