数据结构--实现二叉树(插入节点,删除节点,找最小节点,前序遍历,中序遍历,后序遍历)

二叉树的结构体        

typedef	int ElemType;

typedef struct BTree
{
	ElemType data;
	struct BTree* left;
	struct BTree* right;
}Treenode;

创建一个新节点(动态分配)

Treenode* creatNewNode(ElemType val)
{
	//动态分配内存
	Treenode* NewNode = (Treenode*)malloc(sizeof(Treenode));

	NewNode->data = val;
	NewNode->left = NULL;
	NewNode->right = NULL;
	return NewNode;
}

插入一个新节点(递归)

//插入新节点
Treenode* insert_Btree(Treenode* root, ElemType val)
{
	//判断root是否为空
	if (root == NULL)
		return creatNewNode(val);

	//然后不为空,开始递归寻找插入
	if (val > root->data)
		root->right = insert_Btree(root->right, val);
	else
		root->left = insert_Btree(root->left, val);

	return root;
}

前序遍历

void preorder(Treenode* root)
{
	if (root!= NULL)
	{
		cout << root->data<<" ";
		preorder(root->left);
		preorder(root->right);
	}
}

中序遍历

//中序遍历
void inorder(Treenode* root)
{
	if (root != NULL)
	{
		inorder(root->left);
		cout << root->data << " ";
		inorder(root->right);
	}
}

后序遍历

void postorder(Treenode* root)
{
	if (root != NULL)
	{
		postorder(root->left);
		postorder(root->right);
		cout << root->data << " ";
	}
}

查找最小节点

Treenode* minValueNode(Treenode* root)
{
	//因为二叉树的性质,左边的左边.....最小  
	while (root->left != NULL)
	{
		root = root->left;
	}
	return root;
}

删除节点(图解)

//删除节点
Treenode* deleteBtree(Treenode* root,int val)
{
	if (root == NULL)
		return root;

	if (root->data < val)
		root->right = deleteBtree(root->right, val); //递归右子树查找
	else if (root->data > val)
		root->left = deleteBtree(root->left, val);	//递归左子树查找
	else		//找到要删除节点 if(root->data==val)
	{
		//情况一:当该节点只有右节点
		if (root->left == NULL)
		{
			Treenode* temp = root->right;
			delete root;
			return temp;//返回右子树,替换当前节点 
		}
		//情况二:当该节点只有左节点
		else if (root->right == NULL)
		{
			Treenode* temp = root->left;
			delete root;
			return temp;//返回左子树,替换当前节点 
		}

		//情况三:有左右子树
		Treenode* temp = minValueNode(root->right); //右子树最小的节点
		root->data = temp->data;		//替换掉要删除的节点
		root->right = deleteBtree(root->right, temp->data); //删除右子树最小的节点
	}

	return root;
}

图解如下

主函数调用

int main()
{
	Treenode* root1 = NULL;

	//插入数据
	root1=insert_Btree(root1,50);
	root1=insert_Btree(root1,30);
	root1=insert_Btree(root1,20);
	root1=insert_Btree(root1,40);
	root1=insert_Btree(root1,70);
	root1=insert_Btree(root1,60);
	root1=insert_Btree(root1,80);
	root1=insert_Btree(root1,10);


	//前序遍历调用
	cout << "前序遍历:";
	preorder(root1);
	cout << endl;

	//中序遍历调用
	cout << "中序遍历:";
	inorder(root1);
	cout << endl;

	//前序遍历调用
	cout << "后序遍历:";
	postorder(root1);
	cout << endl;


	//查找最小节点
	cout << "最小的节点值为:";
	cout << minValueNode(root1)->data;
	cout << endl << endl;
	//删除二叉树元素
	root1=deleteBtree(root1,10);


	cout << "删除10前序遍历:";
	preorder(root1);
	cout << endl;

	
	cout << "删除10中序遍历:";
	inorder(root1);
	cout << endl;

	
	cout << "删除10后序遍历:";
	postorder(root1);
	cout << endl;
	return 0;
}

运行结果

全部代码

#pragma warning(disable:4996)
#define _crt_secure_no_warnings
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <assert.h>
#include <iostream>
#include <string.h>
using namespace std;

typedef	int ElemType;

typedef struct BTree
{
	ElemType data;
	struct BTree* left;
	struct BTree* right;
}Treenode;

//创建新节点

Treenode* creatNewNode(ElemType val)
{
	//动态分配内存
	Treenode* NewNode = (Treenode*)malloc(sizeof(Treenode));

	NewNode->data = val;
	NewNode->left = NULL;
	NewNode->right = NULL;
	return NewNode;
}

//插入新节点
Treenode* insert_Btree(Treenode* root, ElemType val)
{
	//判断root是否为空
	if (root == NULL)
		return creatNewNode(val);

	//然后不为空,开始递归寻找插入
	if (val > root->data)
		root->right = insert_Btree(root->right, val);
	else
		root->left = insert_Btree(root->left, val);

	return root;
}

//前序遍历
void preorder(Treenode* root)
{
	if (root!= NULL)
	{
		cout << root->data<<" ";
		preorder(root->left);
		preorder(root->right);
	}
}
//中序遍历
void inorder(Treenode* root)
{
	if (root != NULL)
	{
		inorder(root->left);
		cout << root->data << " ";
		inorder(root->right);
	}
}
//后序遍历
void postorder(Treenode* root)
{
	if (root != NULL)
	{
		postorder(root->left);
		postorder(root->right);
		cout << root->data << " ";
	}
}

//查找最小值
Treenode* minValueNode(Treenode* root)
{
	//因为二叉树的性质,左边的左边.....最小  
	while (root->left != NULL)
	{
		root = root->left;
	}
	return root;
}

//删除节点
Treenode* deleteBtree(Treenode* root,int val)
{
	if (root == NULL)
		return root;

	if (root->data < val)
		root->right = deleteBtree(root->right, val); //递归右子树查找
	else if (root->data > val)
		root->left = deleteBtree(root->left, val);	//递归左子树查找
	else		//找到要删除节点 if(root->data==val)
	{
		//情况一:当该节点只有右节点
		if (root->left == NULL)
		{
			Treenode* temp = root->right;
			delete root;
			return temp;//返回右子树,替换当前节点 
		}
		//情况二:当该节点只有左节点
		else if (root->right == NULL)
		{
			Treenode* temp = root->left;
			delete root;
			return temp;//返回左子树,替换当前节点 
		}

		//情况三:有左右子树
		Treenode* temp = minValueNode(root->right); //右子树最小的节点
		root->data = temp->data;		//替换掉要删除的节点
		root->right = deleteBtree(root->right, temp->data); //删除右子树最小的节点
	}

	return root;
}

	int main()
	{
		Treenode* root1 = NULL;

		//插入数据
		root1=insert_Btree(root1,50);
		root1=insert_Btree(root1,30);
		root1=insert_Btree(root1,20);
		root1=insert_Btree(root1,40);
		root1=insert_Btree(root1,70);
		root1=insert_Btree(root1,60);
		root1=insert_Btree(root1,80);
		root1=insert_Btree(root1,10);


		//前序遍历调用
		cout << "前序遍历:";
		preorder(root1);
		cout << endl;

		//中序遍历调用
		cout << "中序遍历:";
		inorder(root1);
		cout << endl;

		//前序遍历调用
		cout << "后序遍历:";
		postorder(root1);
		cout << endl;


		//查找最小节点
		cout << "最小的节点值为:";
		cout << minValueNode(root1)->data;
		cout << endl << endl;
		//删除二叉树元素
		root1=deleteBtree(root1,10);


		cout << "删除10前序遍历:";
		preorder(root1);
		cout << endl;

	
		cout << "删除10中序遍历:";
		inorder(root1);
		cout << endl;

	
		cout << "删除10后序遍历:";
		postorder(root1);
		cout << endl;
		return 0;
	}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值