二叉排序树
#include<math.h>
#include<stdlib.h>
#include<string>
#include<stdbool.h>
#include<iostream>
using namespace std;
typedef struct TreeNode
{
int data;
int height;
struct TreeNode* left;
struct TreeNode* right;
}Tree;
int Get_Height(Tree*& root)//获取二叉树高度
{
if (root == NULL)
return 0;
return root->height;
}
void updateheight(Tree*& T)
{
if (!T)
return;
T->height = max(Get_Height(T->left), Get_Height(T->right))+1;
}
Tree* LLadjust(Tree*& T)
{
Tree* child = T->left;
T->left = child->right;
child->right = T;
updateheight(child);
updateheight(T);
return child; //此时child为树根
}
Tree* RRadjust(Tree*& T)
{
Tree* child = T->right;
T->right = child->left;
child->left = T;
updateheight(child);
updateheight(T);
return child; //此时child为树根
}
Tree* LRadjust(Tree*& T)
{
T->left = RRadjust(T->left);
return LLadjust(T);
}
Tree* RLadjust(Tree*& T)
{
T->right = LLadjust(T->right);
return RRadjust(T);
}
void adjust(Tree*& T)
{
if (T == NULL)
return;
if (Get_Height(T->left) - Get_Height(T->right) > 1)//左子树高
{
if (Get_Height(T->left->left) >= Get_Height(T->left->right))
T = LLadjust(T);
else
T = LRadjust(T);
}
else if (Get_Height(T->right) - Get_Height(T->left) > 1)//右子树高
{
if (Get_Height(T->right->right) >= Get_Height(T->right->left))
T = RRadjust(T);
else
T = RLadjust(T);
}
}
Tree* InsertTree(Tree*& T, int e)//插入
{
if (T == NULL)
{
T = new Tree;
T->data = e;
T->left = T->right = NULL;
T->height = 1;
return T;
}
if (e == T->data)
return T;
if (e < T->data)
T->left = InsertTree(T->left, e);
else
T->right = InsertTree(T->right, e);
updateheight(T);
adjust(T);
return T;
}
void CreatTree(Tree*& T)//创建
{
int e;
cin >> e;
while (e != 10086)//手动输入10086结束循环
{
InsertTree(T, e);
cin >> e;
}
return;
}
void Inorder_Traversal(Tree* T)//中序遍历
{
if (T == NULL)
{
return;
}
Inorder_Traversal(T->left);
cout << T->data << " ";
Inorder_Traversal(T->right);
}
Tree* DeleteTree(Tree* T, int key)//二叉排序树的删除
{
if (T == NULL)
return T;
if (T->data == key)
{
if (T->left == NULL || T->right == NULL)//如果左右孩子有不存在的 子承父业
{
Tree* temp = T;
T = T->left ? T->left : T->right;
delete temp;
}
else//寻找左孩子的最右结点即直接前驱
{
Tree* temp = T->left;
while (temp->right)
{
temp = temp->right;
}
T->data = temp->data;
T->left = DeleteTree(T->left, T->data);
}
}
else if (key < T->data)
T->left = DeleteTree(T->left, key);
else
T->right = DeleteTree(T->right, key);
updateheight(T);
adjust(T);
return T;
}
int main()
{
Tree* T = NULL;
CreatTree(T);
Inorder_Traversal(T);
T=DeleteTree(T, 12);
T=DeleteTree(T, 18);
Inorder_Traversal(T);
system("pause");
return 0;
}
测试结果如下
平衡二叉树
平衡二叉树难点在于对旋转的理解
代码如下
#include<math.h>
#include<stdlib.h>
#include<string>
#include<stdbool.h>
#include<iostream>
using namespace std;
typedef struct TreeNode
{
int data;
int height;
struct TreeNode* left;
struct TreeNode* right;
}Tree;
int Get_Height(Tree*& root)//获取二叉树高度
{
if (root == NULL)
return 0;
return root->height;
}
void updateheight(Tree*& T)
{
if (!T)
return;
T->height = max(Get_Height(T->left), Get_Height(T->right))+1;
}
Tree* LLadjust(Tree*& T)
{
Tree* child = T->left;
T->left = child->right;
child->right = T;
updateheight(child);
updateheight(T);
return child; //此时child为树根
}
Tree* RRadjust(Tree*& T)
{
Tree* child = T->right;
T->right = child->left;
child->left = T;
updateheight(child);
updateheight(T);
return child; //此时child为树根
}
Tree* LRadjust(Tree*& T)
{
T->left = RRadjust(T->left);
return LLadjust(T);
}
Tree* RLadjust(Tree*& T)
{
T->right = LLadjust(T->right);
return RRadjust(T);
}
void adjust(Tree*& T)
{
if (T == NULL)
return;
if (Get_Height(T->left) - Get_Height(T->right) > 1)//左子树高
{
if (Get_Height(T->left->left) >= Get_Height(T->left->right))
T = LLadjust(T);
else
T = LRadjust(T);
}
else if (Get_Height(T->right) - Get_Height(T->left) > 1)//右子树高
{
if (Get_Height(T->right->right) >= Get_Height(T->right->left))
T = RRadjust(T);
else
T = RLadjust(T);
}
}
Tree* InsertTree(Tree*& T, int e)//插入
{
if (T == NULL)
{
T = new Tree;
T->data = e;
T->left = T->right = NULL;
T->height = 1;
return T;
}
if (e == T->data)
return T;
if (e < T->data)
T->left = InsertTree(T->left, e);
else
T->right = InsertTree(T->right, e);
updateheight(T);
adjust(T);
return T;
}
void CreatTree(Tree*& T)//创建
{
int e;
cout << "输入10086结束" << endl;
cin >> e;
while (e != 10086)//手动输入10086结束循环
{
InsertTree(T, e);
cin >> e;
}
return;
}
void Inorder_Traversal(Tree* T)//中序遍历
{
if (T == NULL)
{
return;
}
Inorder_Traversal(T->left);
cout << T->data << " ";
Inorder_Traversal(T->right);
}
Tree* DeleteTree(Tree* T, int key)//二叉排序树的删除
{
if (T == NULL)
return T;
if (T->data == key)
{
if (T->left == NULL || T->right == NULL)//如果左右孩子有不存在的 子承父业
{
Tree* temp = T;
T = T->left ? T->left : T->right;
delete temp;
}
else//寻找左孩子的最右结点即直接前驱
{
Tree* temp = T->left;
while (temp->right)
{
temp = temp->right;
}
T->data = temp->data;
T->left = DeleteTree(T->left, T->data);
}
}
else if (key < T->data)
T->left = DeleteTree(T->left, key);
else
T->right = DeleteTree(T->right, key);
updateheight(T);
adjust(T);
return T;
}
int main()
{
Tree* T = NULL;
CreatTree(T);
Inorder_Traversal(T);
T=DeleteTree(T, 12);
T=DeleteTree(T, 18);
cout << endl;
Inorder_Traversal(T);
system("pause");
return 0;
}
测试结果如下