求数据结构算法平衡二叉树实现代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求数据结构算法平衡二叉树实现代码相关的知识,希望对你有一定的参考价值。
参考技术A 抄的,你能看懂就行。平衡二叉树实现代码#include <stdio.h>
typedef struct bitreetype
int item;
int bdegree;/*平衡因子,左子树深度-右子树深度*/
struct bitreetype *lchild;
struct bitreetype *rchild;
bitree;
typedef struct treequeuetype
int head;
int tail;
bitree *items[1000];
treequeue;/*定义一个队列,后面的平衡调整要用层序遍历,于是要用这个队列*/
void resetqueue(treequeue *queue)
queue->head=-1;
queue->tail=-1;
return;
/*把队列清空*/
void inqueue(treequeue *queue,bitree *element)
queue->tail++;
queue->items[queue->tail]=element;
/*入队列*/
bitree *outqueue(treequeue *queue)
queue->head++;
return queue->items[queue->head];
/*出队列*/
int isqueueempty(treequeue *queue)
if(queue->head==queue->tail)
return 1;
else
return 0;
/*判断队列是否为空*/
void fillmemory(char *source,int len,char content)
while(len)
source=source+len;
*source=content;
source=source-len;
len--;
*source=0;
/*用CONTENT的内容去FILL以SOURCE为首,LEN长度的一块空间,初始化内存方便*/
int getnums(int *dst)/*输入字符串并把字符串转化为一串数存入DST指向的内存中去,我们用它采集原始数据*/
char *temp,*num,*p,t;
int len=0;
temp=(char *)malloc(1000*sizeof(char));
num=(char *)malloc(20*sizeof(char));
p=num;
fillmemory(temp,1000,0);
fillmemory(num,20,0);
scanf(\"%s\",temp);
t=*temp;
temp++;
while(t)
if(t!=\’,\’)
*num=t;
num++;
t=*temp;
temp++;
/*抽出一个数放入NUM临时空间中*/
else
num=p;
*dst=atoi(num);
len++;
fillmemory(num,20,0);
dst++;
t=*temp;
temp++;
/*将NUM中的数字转化出来存入DST中*/
num=p;
*dst=atoi(num);
len++;
fillmemory(num,20,0);
dst++;
t=*temp;
temp++;
return len;
/*处理最后一个数字*/
数据结构&算法-AVL平衡二叉树
概念
高度平衡的二叉排序树。我们将二叉树上结点的左子树深度减去右子树深度的值成为平衡因子。平衡因子的绝对值不大于1就是平衡二叉树了。
运算结果
代码
using System;
namespace AVLBalancedBinaryTrees
class Program
static void Main(string[] args)
Tree tree = new Tree();
tree.Inset(16);
tree.Inset(3);
tree.Inset(7);
tree.Inset(11);
tree.Inset(9);
tree.Inset(26);
tree.Inset(18);
tree.Inset(14);
tree.Inset(15);
tree.Inset(115);
tree.Inset(315);
tree.Inset(44);
tree.Inset(58);
tree.Inset(31);
tree.InOrder();
Console.ReadKey();
class Node
public int data;//数据
public Node left;//左孩子
public Node right;//又孩子
public Node parent;
public int BF;//平衡因子,左-右 数量
public Node(int data)
this.data = data;
class Tree
Node root;
int count;
public void Inset(int data)
if (root == null)
root = new Node(data);
return;
Node currentNode = root;
Node parentNode = root;
while (currentNode != null)
parentNode = currentNode;
if (data < currentNode.data)
currentNode = currentNode.left;
else
currentNode = currentNode.right;
currentNode = new Node(data);
currentNode.parent = parentNode;
//来到这里说明已经符合条件的位置了
if (data < parentNode.data)
parentNode.left = currentNode;
else
parentNode.right = currentNode;
while (parentNode != null)
if (parentNode.left == currentNode)
parentNode.BF++;
else
parentNode.BF--;
if (parentNode.BF == 0)
break;
else if (parentNode.BF == -1 || parentNode.BF == 1)
currentNode = parentNode;
parentNode = currentNode.parent;
else
if (parentNode.BF == 2)
if (currentNode.BF == 1)//LL
RotaeLL(parentNode);
else
RotateLR(parentNode);
else
if (currentNode.BF == -1)
RotateRR(parentNode);
else
RotateRL(parentNode);
break;
count++;
void RotaeLL(Node parent)
Node grandParent = parent.parent;
Node curNode = parent.left;
if (grandParent != null)
if (grandParent.left == parent)
grandParent.left = curNode;
curNode.parent = grandParent;
grandParent.BF--;
else
grandParent.right = curNode;
curNode.parent = grandParent;
grandParent.BF++;
else
curNode.parent = null;
root = curNode;
parent.left = curNode.right;
if (parent.left != null)
parent.left.parent = parent;
curNode.right = parent;
parent.parent = curNode;
curNode.BF--;
parent.BF--;
public void RotateLR(Node parent)
Node grandParent = parent.parent;
Node curNode = parent.left;
Node c = curNode.right;
if (grandParent != null) //若存在G, 则将c改为g的孩子
if (grandParent.left == parent)
grandParent.left = c;
c.parent = grandParent;
grandParent.BF--;
else
grandParent.right = c;
c.parent = grandParent;
grandParent.BF++;
else //若不存在G
c.parent = null;
root = c;
//将cur的右孩子改为x3
curNode.right = c.left;
if (curNode.right != null)
curNode.right.parent = curNode;
//将p的左孩子改为X4
parent.left = c.right;
if (parent.left != null)
parent.left.parent = parent;
//将c的左孩子改为cur
c.left = curNode;
curNode.parent = c;
//将c的右孩子改为P
c.right = parent;
parent.parent = c;
parent.BF = 0;
curNode.BF++;
c.BF = curNode.BF;
public void RotateRR(Node parent)
Node grandParent = parent.parent;
Node curNode = parent.right;
if (grandParent != null) //若存在G, 则将cur改为g的孩子
if (grandParent.left == parent)
grandParent.left = curNode;
curNode.parent = grandParent;
grandParent.BF--;
else
grandParent.right = curNode;
curNode.parent = grandParent;
grandParent.BF++;
else //若不存在G
curNode.parent = null;
root = curNode;
parent.right = curNode.left; //将cur的左孩子X2改为P的右孩子
if (parent.right != null)
parent.right.parent = parent; //将P改为X2的parent
curNode.left = parent; //将P改为cur的左孩子
parent.parent = curNode; //将cur改为P的parent
curNode.BF++;
parent.BF++;
public void RotateRL(Node parent)
Node grandParent = parent.parent;
Node curNode = parent.right;
Node c = curNode.left;
if (grandParent != null) //若存在G, 则将c改为g的孩子
if (grandParent.left == parent)
grandParent.left = c;
c.parent = grandParent;
grandParent.BF--;
else
grandParent.right = c;
c.parent = grandParent;
grandParent.BF++;
else //若不存在G
c.parent = null;
root = c;
//将cur的左孩子改为x4
curNode.left = c.right;
if (curNode.left != null)
curNode.left.parent = curNode;
//将p的右孩子改为X3
parent.right = c.left;
if (parent.right != null)
parent.right.parent = parent;
//将c的右孩子改为cur
c.right = curNode;
curNode.parent = c;
//将c的左孩子改为P
c.left = parent;
parent.parent = c;
parent.BF = 0;
curNode.BF--;
c.BF = -curNode.BF;
public void InOrder()
_InOrder(root);
private void _InOrder(Node node)
if (node == null)
return;
_InOrder(node.left);
Console.Write(node.data + " ");
_InOrder(node.right);
参考
以上是关于求数据结构算法平衡二叉树实现代码的主要内容,如果未能解决你的问题,请参考以下文章