二叉树的实现

参考:二叉查找树(一)之 图文解析 和 C语言的实现

目录

  1. 二叉树的存储结构定义
  2. 前序遍历二叉树
  3. 中序遍历二叉树
  4. 后序遍历二叉树
  5. 二叉树的创建:利用前序遍历的方法
  6. 查找二叉树中值为x的结点地址
  7. 统计二叉树中结点的个数
  8. 判断二叉树是否等价
  9. 求二叉树的高度
    以上函数实现都是利用树的递归定义!

  1. 二叉树的存储结构定义
    typedef int datatype;
    typedef struct BTreeNode   //二叉树结点结构体
    {
    	datatype key;
    	struct BTreeNode *left;
    	struct BTreeNode *right;
    }Node, *p_BTree;
  2. 前序遍历二叉树
    /*-------------------------
    前序遍历二叉树——递归
    参数:指向二叉树根结点指针
    --------------------------*/
    void preorder_btree(p_BTree tree)
    {
    	if (tree)
    	{
    		printf("%d ", tree->key);
    		preorder_btree(tree->left);
    		preorder_btree(tree->right);
    	}
    }
  3. 中序遍历二叉树
    /*-------------------------
    中序遍历二叉树——递归
    参数:指向二叉树根结点指针
    --------------------------*/
    void inorder_btree(p_BTree tree)
    {
    	if (tree)
    	{
    		inorder_btree(tree->left);
    		printf("%d ", tree->key);
    		inorder_btree(tree->right);
    	}
    }
  4. 后序遍历二叉树
    /*-------------------------
    后序遍历二叉树——递归
    参数:指向二叉树根结点指针
    --------------------------*/
    void postorder_btree(p_BTree tree)
    {
    	if (tree)
    	{
    		postorder_btree(tree->left);
    		postorder_btree(tree->right);
    		printf("%d ", tree->key);
    	}
    }
  5. 二叉树的创建:利用前序遍历的方法
    /*-----------------------------------
    根据前序遍历的结果创建一个棵给定的二叉树
    参数:指向二叉树根结点的指针的指针
    -------------------------------------*/
    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);
    	}
    }
  6. 查找二叉树中值为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);
    			}
    		}
    	}
    }
  7. 统计二叉树的结点个数
    /*---------------------------------------
    统计二叉树中结点的个数
    参数:指向二叉树根结点的指针
    ----------------------------------------*/
    int numofnode(p_BTree tree)
    {
    	if (tree == NULL) return 0;
    	else return (numofnode(tree->left)+numofnode(tree->right) + 1);
    }
  8. 判断二叉树是否等价
    /*-----------------------------------------
    判断二叉树是否等价
    参数:指向二叉树根结点的指针
    -----------------------------------------*/
    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;
    }
  9. 求二叉树的高度
    /*------------------------------------------------------
    求二叉树的高度(深度 )
    参数:指向二叉树根结点的指针
    --------------------------------------------------------*/
    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;
    }

算法实现源码下载地址:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值