数据结构c/c++---------------------二叉树

代码实现

结构体定义

节点数据和左右孩子

typedef struct _Tree
{
	int data;
	struct _Tree* lchild;
	struct _Tree* rchild;
}Btree;

遍历

前序遍历,对于二叉树使用递归是很方便进行遍历的
中序遍历,后序遍历都很简单

void printBtree(Btree* b)
{
	if (b == NULL) return;
	cout << b->data << " ";
	printBtree(b->lchild);
	printBtree(b->rchild);

}

插入

分两种情况,一种是根节点为空,一种是根节点不为空。
根节点为空直接对根节点赋值就好。
根节点不为空,我们需要对比根节点数据与插入数据的大小,大于插入数据插入到左边,否则插入到右边,这是为了更好地进行查找。

bool insertBtree(Btree*& b, int val)
{
	if (b == NULL)
	{
		b = new Btree;
		b->data = val;
		b->lchild = NULL;
		b->rchild = NULL;
		return true;
	}

	Btree* node = new Btree;
	node->data = val;
	node->lchild = NULL;
	node->rchild = NULL;

	Btree* p = b;
	Btree* parent;
	while (p)
	{
		parent = p;

		if (p->data > node->data)
		{
			p = p->lchild;
		}
		else
		{
			p = p->rchild;
		}
	}

	if (parent->data > node->data)
	{
		parent->lchild = node;
	}
	else
	{
		parent->rchild = node;
	}


	return true;
}

查找

我们的二叉树是一棵类似这样的树,左孩子小于等于根节点,右孩子大于。所以我们查找的时候,可以很快的查找到需要的数据。
在这里插入图片描述

// 递归实现
Btree* findBtree1(Btree* b, int val)
{
	if (b == NULL)
	{
		return NULL;
	}
	if (b->data == val)
	{
		return b;
	}
	else if(b->data > val)
	{
		findBtree1(b->lchild, val);
	}
	else
	{
		findBtree1(b->rchild, val);
	}
}

// 循环实现
Btree* findBtree2(Btree* b, int val)
{
	if (b == NULL) return b;

	while (b)
	{
		if (b->data == val)
		{
			return b;
		}
		else if (b->data > val)
		{
			b = b->lchild;
		}
		else
		{
			b = b->rchild;
		}
	}
	return NULL;
}

找最大节点

递归实现,对于我们这棵树最大节点永远是右孩子。

Btree* findMax(Btree* b)
{
	if (b == NULL) return b;

	if (b->rchild)
	{
		return findMax(b->rchild);
	}
	else
	{
		return b;
	}
}

删除

删除分为四种情况:
1 删除节点无左右孩子
2 删除节点无左孩子,有右孩子
3 删除节点无右孩子,有左孩子
4 删除节点有左右孩子
第一种情况,我们直接删除就好
第二种情况,我们将删除节点的右孩子代替删除节点
第三种情况,我们将删除节点的左孩子代替删除节点
第四种情况,我们将删除节点左子树的最大节点代替删除节点,然后删除掉删除节点左子树的该节点

Btree* deleteBtree(Btree* b, int val)
{
	if (b == NULL) return NULL;

	if (b->data > val)
	{
		b->lchild = deleteBtree(b->lchild, val);
		return b;
	}

	if (b->data < val)
	{
		b->rchild = deleteBtree(b->rchild, val);
		return b;
	}

	if (b->lchild == NULL && b->rchild == NULL) return NULL;
	if (b->lchild != NULL && b->rchild == NULL) return b->lchild;
	if (b->lchild == NULL && b->rchild != NULL) return b->rchild;

	Btree* node = findMax(b->lchild);
	b->data = node->data;
	b->lchild = deleteBtree(b->lchild, node->data);

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值