您的位置:首页 > 其它

二叉树的实现

2015-06-01 16:43 375 查看
参考:二叉查找树(一)之
图文解析 和 C语言的实现

目录

二叉树的存储结构定义
前序遍历二叉树
中序遍历二叉树
后序遍历二叉树
二叉树的创建:利用前序遍历的方法
查找二叉树中值为x的结点地址
统计二叉树中结点的个数
判断二叉树是否等价
求二叉树的高度

以上函数实现都是利用树的递归定义!

二叉树的存储结构定义
typedef int datatype;
typedef struct BTreeNode   //二叉树结点结构体
{
datatype key;
struct BTreeNode *left;
struct BTreeNode *right;
}Node, *p_BTree;

前序遍历二叉树
/*-------------------------
前序遍历二叉树——递归
参数:指向二叉树根结点指针
--------------------------*/
void preorder_btree(p_BTree tree)
{
if (tree)
{
printf("%d ", tree->key);
preorder_btree(tree->left);
preorder_btree(tree->right);
}
}

中序遍历二叉树
/*-------------------------
中序遍历二叉树——递归
参数:指向二叉树根结点指针
--------------------------*/
void inorder_btree(p_BTree tree)
{
if (tree)
{
inorder_btree(tree->left);
printf("%d ", tree->key);
inorder_btree(tree->right);
}
}

后序遍历二叉树
/*-------------------------
后序遍历二叉树——递归
参数:指向二叉树根结点指针
--------------------------*/
void postorder_btree(p_BTree tree)
{
if (tree)
{
postorder_btree(tree->left);
postorder_btree(tree->right);
printf("%d ", tree->key);
}
}

二叉树的创建:利用前序遍历的方法
/*-----------------------------------
根据前序遍历的结果创建一个棵给定的二叉树
参数:指向二叉树根结点的指针的指针
-------------------------------------*/
void creatbintree(p_BTree *tree)	//指针的指针,用于修改指针中存放的地址值
{
int datain;
if ((scanf("%d", &datain))==1 && datain == 0)  //Q_yyt:可以用什么标识符
{
(*tree) = NULL;
}
else
{
(*tree) = (p_BTree)malloc(sizeof(BTreeNode));
(*tree) -> key = datain;
creatbintree(&(*tree)->left);
creatbintree(&(*tree)->right);
}
}

查找二叉树中值为x的结点地址
/*--------------------------------------------
二叉树的查找,查找二叉树中值为x的结点的位置
参数: 指向二叉树根结点的指针
---------------------------------------------*/
p_BTree locate(p_BTree tree, datatype x)
{
p_BTree p;
if (tree == NULL)
{
return NULL;
}
else
{
if (tree->key == x)
{
return tree;
}
else
{
p = locate(tree->left, x);
if (p)
{
return p;
}
else
{
return locate(tree->right, x);
}
}
}
}

统计二叉树的结点个数
/*---------------------------------------
统计二叉树中结点的个数
参数:指向二叉树根结点的指针
----------------------------------------*/
int numofnode(p_BTree tree)
{
if (tree == NULL) return 0;
else return (numofnode(tree->left)+numofnode(tree->right) + 1);
}

判断二叉树是否等价
/*-----------------------------------------
判断二叉树是否等价
参数:指向二叉树根结点的指针
-----------------------------------------*/
int isequal(p_BTree tree1, p_BTree tree2)
{
int t;
t = 0;
if (tree1==NULL && tree2==NULL)
{
t=1;
}
else
{
if (tree1!=NULL && tree2!=NULL)
{
if (tree1->key == tree2->key)
{
if (isequal(tree1->left, tree2->left))
{
t = isequal(tree1->right, tree2->right);
}
}
}
}
return t;
}

求二叉树的高度
/*------------------------------------------------------
求二叉树的高度(深度 )
参数:指向二叉树根结点的指针
--------------------------------------------------------*/
int depth(p_BTree tree)
{
int h, lh, rh;
if (tree == NULL)
{
h = 0;
}
else
{
lh = depth(tree->left);
rh = depth(tree->right);
h = (lh >= rh)?lh+1:rh+1;
}
return h;
}


算法实现源码下载地址:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: