// erchashu_xiti.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<iostream>
#include<queue>
#include <stack>
using namespace std;
//定义树节点结构
typedef struct Tree {
int key;
Tree* p;
Tree* left;
Tree* right;
int Heigh;
}Tree;
typedef Tree* TreeNode;
static int Height(TreeNode p) //返回树高,尤其是空节点高度的处理
{
if (p == NULL)
return -1;
else
return p->Heigh;
}
static TreeNode zuoxuan(TreeNode &K2) //左旋转,高子树在左边
{
TreeNode K1;
K1 = K2->left;
K2->left = K1->right;
K1->right = K2;
K2->Heigh= max(Height(K2->left), Height(K2->right)) + 1;
K1->Heigh = max(Height(K1->left), Height(K1->right)) + 1;
return K1;
}
static TreeNode youxuan(TreeNode &K1) //右旋转,高子树在右边
{
TreeNode K2;
K2 = K1->right;
K1->right = K2->left;
K2->left = K1;
K2->Heigh = max(Height(K2->left), Height(K2->right)) + 1;
K1->Heigh = max(Height(K1->left), Height(K1->right)) + 1;
return K2;
}
static TreeNode zuoyouxuan(TreeNode &K3) //左右旋转,高子树在左边,孙子在儿子右边
{
K3->left = youxuan(K3->left);
return zuoxuan(K3);
}
static TreeNode youzuoxuan(TreeNode &K3) //右左旋转,高子树在右边,孙子在儿子左边
{
K3->right = zuoxuan(K3->right);
return youxuan(K3);
}
TreeNode Insert(TreeNode& T, int x, TreeNode p) //插入的递归版本
{
if (T == NULL) {
T = (TreeNode)malloc(sizeof(Tree));
T->key = x;
T->left = NULL;
T->right = NULL;
T->p = p;
T->Heigh = 0;
}
else if(x!=T->key) {
p = T;
if (x < T->key)
{
T->left=Insert(T->left, x, p);
if (Height(T->left) - Height(T->right) == 2)
if (x < T->left->key)
T = zuoxuan(T);
else
T = zuoyouxuan(T);
}
else if (x > T->key)
{
T->right=Insert(T->right, x, T);
if (Height(T->right) - Height(T->left) == 2)
if (x > T->right->key)
T = youxuan(T);
else
T = youzuoxuan(T);
}
T->Heigh = max(Height(T->left), Height(T->right)) + 1;
}
return T;
}
bool Insert2(TreeNode& T, int x) //插入的非递归版本
{
stack<TreeNode> node;
bool flag = 0;
TreeNode Tmp = T;
while (!flag) {
if (Tmp == NULL) {
Tmp = (TreeNode)malloc(sizeof(Tree));
Tmp->key = x;
Tmp->left = NULL;
Tmp->right = NULL;
Tmp->Heigh = 0;
if (!node.empty()) {
if (x > node.top()->key)
node.top()->right = Tmp;
else
node.top()->left = Tmp;
}
while (!node.empty()) {
Tmp = node.top();
node.pop();
Tmp->Heigh = max(Height(Tmp->left), Height(Tmp->right)) + 1;
if (Height(Tmp->left) - Height(Tmp->right) == 2) {
if (x < Tmp->left->key)
Tmp = zuoxuan(Tmp);
else
Tmp = zuoyouxuan(Tmp);
if (!node.empty()) {
if (Tmp->key > node.top()->key)
node.top()->right = Tmp;
else
node.top()->left = Tmp;
}
Tmp->Heigh = max(Height(Tmp->left), Height(Tmp->right)) + 1;
}
else if (Height(Tmp->right) - Height(Tmp->left) == 2) {
if (x > Tmp->right->key)
Tmp = youxuan(Tmp);
else
Tmp = youzuoxuan(Tmp);
if (!node.empty()) {
if (Tmp->key > node.top()->key)
node.top()->right = Tmp;
else
node.top()->left = Tmp;
}
Tmp->Heigh = max(Height(Tmp->left), Height(Tmp->right)) + 1;
}
}
flag = 1;
}
else
{
while (Tmp!=NULL) {
node.push(Tmp);
if (x > Tmp->key) Tmp = Tmp->right;
else Tmp = Tmp->left;
}
}
}
T = Tmp;
return true;
}
TreeNode FindMin(TreeNode T) //&函数别名别乱用,开始这里用了函数别名导致最后结果丢失了右子树
{
TreeNode tmp=T;
while(tmp->left)
tmp = tmp->left;
return tmp;
}
TreeNode Delete(TreeNode& T, int x) //删除操作,主要考察删除后左右子树高度的变化
{
TreeNode Tmp;
if (T == NULL)
cout << "empty!" << endl;
else if (T->key > x)
{
T->left = Delete(T->left, x);
if (Height(T->right) - Height(T->left) == 2)
if (x > T->right->key)
T = youxuan(T);
else
T = youzuoxuan(T);
}
else if (T->key < x)
{
T->right = Delete(T->right, x);
if (Height(T->left) - Height(T->right) == 2)
if (x < T->left->key)
T = zuoxuan(T);
else
T = zuoyouxuan(T);
}
else
{
if (T->left&&T->right) {
Tmp = FindMin(T->right);
T->key = Tmp->key;
T->right = Delete(T->right, T->key);
}
else
{
Tmp = T;
if (T->left == NULL)
T = T->right;
else if (T->right == NULL)
T = T->left;
free(Tmp);
}
}
return T;
}
void Init(TreeNode& T, int key[],int n) //利用数组初始化二叉树
{
for (int i = 1; i <= n; i++)
//Insert(T, key[i], NULL);
Insert2(T, key[i]);
}
void PrintTree(TreeNode T) //层序遍历
{
cout << T->key << endl;
queue<TreeNode> q;
q.push(T->left);
q.push(T->right);
while (!q.empty())
{
if(q.front()==NULL) q.pop();
else
{
cout << q.front()->key << endl;
q.push(q.front()->left);
q.push(q.front()->right);
q.pop();
}
}
}
int main()
{
TreeNode T=NULL;
int key[10] = { 0,2,1,4,5,9,3,6,7 };
Init(T, key,8);
//cout << FindMin(T)->key<<endl;
PrintTree(T);
//Insert2(T, 10);
//Delete(T, 5);
//PrintTree(T);
//cout << T->right->key;
while (1);
return 0;
}