二叉树的结构体
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;
}