使用C语言建立一棵二叉树,并实现先序遍历、删除、复制等操作

建立一颗二叉树,先序遍历二叉树,删除整棵树,复制一棵二叉树

下面就是相关代码:

 

//功能实现:建立一颗二叉树,先序遍历二叉树,删除整棵树,复制一棵二叉树
#include<stdio.h>
#include<stdlib.h>

//定义二叉树节点
typedef struct TreeNode
{
	int data;
	struct TreeNode* l_child;
	struct TreeNode* r_child;
}TreeNode;

TreeNode* creatNode(int val)
{
	TreeNode* Node = (TreeNode*)malloc(sizeof(TreeNode));
	Node->data = val;
	Node->l_child = NULL;
	Node->r_child = NULL;
	return Node;
}
//创建二叉树
TreeNode* buildBitree()
{
	int val;
	printf("请输入节点的值(-1代表空节点):");
	scanf("%d", &val);
	if (val == -1)
		return NULL;

	TreeNode* root = creatNode(val);
	printf("请输入 %d 的左子节点:\n", val);
	root->l_child = buildBitree();

	printf("请输入 %d 的右子节点:\n", val);
	root->r_child = buildBitree();
	return root;
}

//先序遍历
void preorderTraversal(TreeNode* root)
{
	if (root == NULL)
		return;
	printf("%d\t", root->data);
	preorderTraversal(root->l_child);
	preorderTraversal(root->r_child);
}

//删除二叉树
void freeNode(TreeNode* Node)
{
	if (Node == NULL)
		return;
	freeNode(Node->l_child);
	freeNode(Node->r_child);
	free(Node);
}

void deleteBitree(TreeNode** root)
{
	if (*root == NULL)
		return;
	freeNode((*root)->l_child);
	freeNode((*root)->r_child);
	free(*root);
	*root = NULL;
}

void copy(TreeNode** dest, TreeNode* src)
{
	if (src == NULL)
	{
		*dest = NULL;
		return;
	}
	else
	{
		*dest = creatNode(src->data);
		copy(&(*dest)->l_child, src->l_child);
		copy(&(*dest)->r_child, src->r_child);
	}
}


int main()
{
	printf("动态建立二叉树示例:\n");
	TreeNode* root = buildBitree();
	printf("前序遍历结果:");
	preorderTraversal(root);

	TreeNode* Newroot;
	copy(&Newroot, root);
	printf("前序遍历结果:");
	preorderTraversal(Newroot);

	deleteBitree(&root);
	deleteBitree(&Newroot);

	return 0;
}

 因为二叉树的递归定义,因此我们也可以利用递归函数建立一棵二叉树,但是需要注意到的是,函数传递的参数,到底是传一级指针还是二级指针,看你要对它的操作而定。具体来说,如果你要修改指针的指向就要传二级指针,如果仅仅是遍历等操作,不对实参做操作,传一级指针就行。

 

代码示例:

 

算法---计算二叉树的深度、节点总数、叶子节点数

 

代码:

//计算二叉树的深度,比较左子树和右子树的深度,返回更大的加一
int Depth(TreeNode* T)
{
	if (T == NULL)
		return 0;
	else
	{
		int m = Depth(T->l_child);
		int n = Depth(T->r_child);
		if (m > n) return (m + 1);
		else return (n + 1);
	}
}

//计算二叉树节点总数
int NodeCount(TreeNode* T)
{
	if (T == NULL) return 0;
	else
		return NodeCount(T->l_child) + NodeCount(T->r_child) + 1;
}

//计算叶子节点
int LeafCount(TreeNode* T)
{
	if (T == NULL)
		return 0;
	if (T->l_child == NULL && T->r_child == NULL)
		return 1;
	else
		return LeafCount(T->l_child) + LeafCount(T->r_child);
}

 执行结果:

 

 

  • 8
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值