C sharp实现平衡二叉树算法的代码
时间: 2023-08-31 21:33:29 浏览: 62
### 回答1:
平衡二叉树是一种能保证在数据较多时,其效率较高的二叉搜索树。下面是一个使用 C# 语言实现的平衡二叉树的示例代码:
```
public class AVLTree
{
private class Node
{
public int Key { get; set; }
public int Balance { get; set; }
public Node Left { get; set; }
public Node Right { get; set; }
public Node(int key)
{
Key = key;
}
}
private Node _root;
public void Insert(int key)
{
_root = Insert(_root, key);
}
private Node Insert(Node root, int key)
{
if (root == null)
{
return new Node(key);
}
if (key < root.Key)
{
root.Left = Insert(root.Left, key);
}
else if (key > root.Key)
{
root.Right = Insert(root.Right, key);
}
return Balance(root);
}
private Node Balance(Node root)
{
var balance = GetBalance(root);
if (balance > 1)
{
if (GetBalance(root.Left) > 0)
{
root = RotateRight(root);
}
else
{
root = RotateLeftRight(root);
}
}
else if (balance < -1)
{
if (GetBalance(root.Right) < 0)
{
root = RotateLeft(root);
}
else
{
root = RotateRightLeft(root);
}
}
return root;
}
private int GetHeight(Node root)
{
return root == null ? 0 : 1 + Math.Max(GetHeight(root.Left), GetHeight(root.Right));
}
private int GetBalance(Node root)
{
return root == null ? 0 : GetHeight(root.Left) - GetHeight(root.Right);
}
private Node RotateRight(Node root)
{
var newRoot = root.Left;
root.Left = newRoot.Right;
newRoot.Right = root;
return newRoot;
}
private Node RotateLeft(Node root)
{
var newRoot = root.Right;
root.Right = newRoot.Left;
newRoot.Left = root;
return newRoot;
}
private Node RotateRightLeft(Node root)
{
root.Right = RotateRight(root.Right);
return RotateLeft(root);
}
private Node RotateLeftRight(Node root)
{
root.Left = RotateLeft(root.Left);
return Rot
### 回答2:
下面给出一个C#实现平衡二叉树算法的代码示例:
```csharp
// 定义二叉树节点类
public class TreeNode
{
public int value;
public int height;
public TreeNode left;
public TreeNode right;
public TreeNode(int val)
{
value = val;
height = 1;
left = null;
right = null;
}
}
// 定义平衡二叉树类
public class AVLTree
{
private TreeNode root;
// 获取节点高度
private int GetHeight(TreeNode node)
{
if (node == null)
return 0;
return node.height;
}
// 获取节点平衡因子
private int GetBalanceFactor(TreeNode node)
{
if (node == null)
return 0;
return GetHeight(node.left) - GetHeight(node.right);
}
// 更新节点高度
private void UpdateHeight(TreeNode node)
{
node.height = Math.Max(GetHeight(node.left), GetHeight(node.right)) + 1;
}
// 右旋函数
private TreeNode RotateRight(TreeNode node)
{
TreeNode newRoot = node.left;
node.left = newRoot.right;
newRoot.right = node;
UpdateHeight(node);
UpdateHeight(newRoot);
return newRoot;
}
// 左旋函数
private TreeNode RotateLeft(TreeNode node)
{
TreeNode newRoot = node.right;
node.right = newRoot.left;
newRoot.left = node;
UpdateHeight(node);
UpdateHeight(newRoot);
return newRoot;
}
// 插入节点
public TreeNode Insert(TreeNode root, int value)
{
if (root == null)
return new TreeNode(value);
if (value < root.value)
root.left = Insert(root.left, value);
else if (value > root.value)
root.right = Insert(root.right, value);
else
return root;
UpdateHeight(root);
int balanceFactor = GetBalanceFactor(root);
// 左旋情况
if (balanceFactor > 1 && value < root.left.value)
return RotateRight(root);
// 右旋情况
if (balanceFactor < -1 && value > root.right.value)
return RotateLeft(root);
// 左右旋情况
if (balanceFactor > 1 && value > root.left.value)
{
root.left = RotateLeft(root.left);
return RotateRight(root);
}
// 右左旋情况
if (balanceFactor < -1 && value < root.right.value)
{
root.right = RotateRight(root.right);
return RotateLeft(root);
}
return root;
}
// 中序遍历二叉树
public void InorderTraversal(TreeNode node)
{
if (node == null)
return;
InorderTraversal(node.left);
Console.Write(node.value + " ");
InorderTraversal(node.right);
}
}
// 测试代码
class Program
{
static void Main(string[] args)
{
AVLTree tree = new AVLTree();
tree.root = tree.Insert(tree.root, 10);
tree.root = tree.Insert(tree.root, 20);
tree.root = tree.Insert(tree.root, 30);
tree.root = tree.Insert(tree.root, 40);
tree.root = tree.Insert(tree.root, 50);
tree.root = tree.Insert(tree.root, 25);
Console.WriteLine("中序遍历结果:");
tree.InorderTraversal(tree.root);
}
}
```
以上代码实现了一个平衡二叉树(AVL树)的插入和中序遍历功能。在插入节点时,根据节点的值和树的结构,在不平衡的情况下进行旋转操作,使树保持平衡。中序遍历函数可以用于验证树的构建是否正确。