闲来无事,最近用C#实现了数据结构的二叉树 其中包括排序二叉树的实现。
首先来看一下二叉树节点的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinkBiTree
{
public class BiTreeNode<T> where T:IComparable<T>
{
//定义数据域
private T data;
//定义二叉树的左孩子节点
private BiTreeNode<T> lChild;
//定义右孩子节点
private BiTreeNode<T> rChild;
//构造函数
//含三参的构造函数
public BiTreeNode(T val,BiTreeNode<T> lc,BiTreeNode<T> rc)
{
data = val;
lChild = lc;
rChild = rc;
}
//含俩参的构造函数
public BiTreeNode(BiTreeNode<T> lc, BiTreeNode<T> rc)
{
data=default(T);
lChild = lc;
rChild = rc;
}
//含一参的构造函数
public BiTreeNode(T val)
{
data = val;
lChild = null;
rChild = null;
}
//无参的构造函数
public BiTreeNode()
{
data = default(T);
lChild = null;
rChild = null;
}
//数据域属性
public T Data
{
get
{
return data;
}
set
{
data = value;
}
}
//左孩子域
public BiTreeNode<T> LChild
{
get
{
return lChild;
}
set
{
lChild = value;
}
}
//右孩子域属性
public BiTreeNode<T> RChild
{
get
{
return rChild;
}
set
{
rChild = value;
}
}
}
}
接着来看二叉树的定义和基本运算的实现
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace LinkBiTree
{
public class LinkBiTree<T> where T : IComparable<T>
{
//头引用字段
private BiTreeNode<T> head;
//头引用属性
public BiTreeNode<T> Head
{
get
{
return head;
}
set
{
head = value;
}
}
//构造函数
//不含参数的构造函数
public LinkBiTree()
{
head = null;
}
//含一个参数的构造函数
public LinkBiTree(T val)
{
BiTreeNode<T> p = new BiTreeNode<T>(val);
head = p;
}
//含三参数的构造函数
public LinkBiTree(T val, BiTreeNode<T> lc, BiTreeNode<T> rc)
{
BiTreeNode<T> p = new BiTreeNode<T>(val, lc, rc);
head = p;
}
// 二叉树判空
public bool IsEmpty()
{
if (head == null)
{
return true;
}
else
{
return false;
}
}
//获取根节点
public BiTreeNode<T> Root()
{
return head;
}
//获取节点的左孩子
public BiTreeNode<T> GetLChild(BiTreeNode<T> p)
{
return p.LChild;
}
//获取节点的右孩子
public BiTreeNode<T> GetRChild(BiTreeNode<T> p)
{
return p.RChild;
}
//将节点p的左子树插入值为val的新节点,原来的左子树成为新节点的左子树
public void InsertLChlid(T val, BiTreeNode<T> p)
{
BiTreeNode<T> temp = new BiTreeNode<T>(val);
temp.LChild = p.LChild;
p.LChild = temp;
}
//排序插入函数
public void SortInsert(T newItem,BiTreeNode<T> p)
{
if (p.Data.CompareTo(newItem)>0)
{
if (p.LChild == null)
{
p.LChild = new BiTreeNode<T>(newItem);
}
else
{
SortInsert(newItem, p.LChild);
}
}
else
{
if (p.RChild == null)
{
p.RChild = new BiTreeNode<T>(newItem);
}
else
{
SortInsert(newItem, p.RChild);
}
}
}
//将节点p的右子树插入值为val的新节点,原来的右子树成为新节点的右子树
public void InsertRChild(T val, BiTreeNode<T> p)
{
BiTreeNode<T> temp = new BiTreeNode<T>(val);
temp.RChild = p.RChild;
p.RChild = temp;
}
//若p非空 删除节点p的左子树 并将删除的左子树返回
public BiTreeNode<T> DeleteLChild(BiTreeNode<T> p)
{
if ((p == null) || (p.LChild == null))
{
return null;
}
BiTreeNode<T> temp = p.LChild;
p.LChild = null;
return temp;
}
//若p非空 删除节点p的右子树 并将删除的右子树返回
public BiTreeNode<T> DeleteRChild(BiTreeNode<T> p)
{
if ((p == null) || (p.RChild== null))
{
return null;
}
BiTreeNode<T> temp = p.RChild;
p.RChild = null;
return temp;
}
//在二叉树中查找值为val的节点
public BiTreeNode<T> Search(BiTreeNode<T> Root, T val)
{
BiTreeNode<T> p = Root;
if (p == null)
{
return null;
}
if (p.Data.Equals(val))
{
return p;
}
//递归求左子树
if (p.LChild != null)
{
return Search(p.LChild, val);
}
//递归求右子树
if(p.RChild!=null)
{
return Search(p.RChild ,val);
}
return null;
}
//判断是否为叶子节点
public bool IsLeaf(BiTreeNode<T> p)
{
if ((p != null) && (p.LChild == null) && (p.RChild == null))
{
return true;
}
else
{
return false;
}
}
}
}
排序二叉树的测试程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LinkBiTree;
namespace SortedBiTreeVisit
{
class Program
{
public static StringBuilder SortedBiTreestr=new StringBuilder();
//排列二叉树的遍历
public static string SortedBiTreeVisit(BiTreeNode<int> p)
{
if (p.LChild != null)
{
SortedBiTreeVisit(p.LChild);
}
SortedBiTreestr.Append(p.Data.ToString()+" ");
if (p.RChild != null)
{
SortedBiTreeVisit(p.RChild);
}
return SortedBiTreestr.ToString();
}
static void Main(string[] args)
{
LinkBiTree<int> li = new LinkBiTree<int>(1);
li.SortInsert(23,li.Head);
li.SortInsert(66, li.Head);
li.SortInsert(17, li.Head);
li.SortInsert(12, li.Head);
li.SortInsert(19, li.Head);
string result=SortedBiTreeVisit(li.Head);
Console.WriteLine(result);
Console.ReadKey();
}
}
}
二叉树的遍历测试程序
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using LinkBiTree;
namespace BiTreeVisit
{
class Program
{
//用来存储遍历的数据
public static StringBuilder PreOderstr = new StringBuilder();
public static StringBuilder MidOderstr = new StringBuilder();
public static StringBuilder AftOderstr = new StringBuilder();
public static StringBuilder LevOderstr = new StringBuilder();
//保存叶子节点的个数
public static int leafcount = 0;
//保存二叉树深度
左子树
//public static int LBiTreeHeight = 1;
右子树
//public static int RBiTreeHeight = 1;
//先序遍历递归算法
public static string PreOrder(BiTreeNode<string> p )
{
if (p!= null)
{
PreOderstr.Append(p.Data+" ");
PreOrder(p.LChild);
PreOrder(p.RChild);
}
return PreOderstr.ToString();
}
//中序遍历递归算法
public static string MidOrder(BiTreeNode<string> p)
{
if (p != null)
{
MidOrder(p.LChild);
MidOderstr.Append(p.Data + " ");
MidOrder(p.RChild);
}
return MidOderstr.ToString();
}
//后序遍历递归算法
public static string AftOrder(BiTreeNode<string> p)
{
if (p != null)
{
AftOrder(p.LChild);
AftOrder(p.RChild);
AftOderstr.Append(p.Data + " ");
}
return AftOderstr.ToString();
}
//层次遍历
public static string LevOrder(BiTreeNode<string> p)
{
if (p == null)
{
return null;
}
Queue<BiTreeNode<string>> sq = new Queue<BiTreeNode<string>>();
sq.Enqueue(p);
//循环层次遍历
while (sq.Count > 0)
{
//节点出队列
BiTreeNode<string> temp = sq.Dequeue();
//将出队列的节点加入到字符串中
LevOderstr.Append(temp.Data + " ");
//将出队列的节点的左孩子加入队列
if (temp.LChild != null)
{
sq.Enqueue(temp.LChild);
}
//将出队列的节点的右孩子加入队列
if (temp.RChild!=null)
{
sq.Enqueue(temp.RChild);
}
}
return LevOderstr.ToString();
}
//计算二叉树的叶子结点个数
public static int CalCount(BiTreeNode<string> p)
{
if (p == null)
{
return 0;
}
Queue<BiTreeNode<string>> sq = new Queue<BiTreeNode<string>>();
sq.Enqueue(p);
//循环层次遍历
while (sq.Count > 0)
{
//节点出队列
BiTreeNode<string> temp = sq.Dequeue();
//将出队列的节点加入到字符串中
LevOderstr.Append(temp.Data + " ");
if ((temp.LChild == null) && (temp.RChild == null))
{
leafcount += 1;
}
//将出队列的节点的左孩子加入队列
if (temp.LChild != null)
{
sq.Enqueue(temp.LChild);
}
//将出队列的节点的右孩子加入队列
if (temp.RChild != null)
{
sq.Enqueue(temp.RChild);
}
}
return leafcount;
}
//求二叉树深度
public static int CalBitTreeHeight(BiTreeNode<string> p)
{
//定义局部变量保存左子树深度和右子树深度
int LBiTreeHeight;
右子树
int RBiTreeHeight ;
if (p == null)
{
return 0;
}
else
{
//
LBiTreeHeight=CalBitTreeHeight(p.LChild);
//
RBiTreeHeight = CalBitTreeHeight(p.RChild);
}
if (LBiTreeHeight >= RBiTreeHeight)
return (LBiTreeHeight + 1);
else
return (RBiTreeHeight + 1);
}
//测试函数
static void Main(string[] args)
{
//初始化二叉树
LinkBiTree<string> p = new LinkBiTree<string>("A");
//建立二叉树
BiTreeNode<string> temp = p.Head;
temp.LChild = new BiTreeNode<string>("B");
temp.RChild = new BiTreeNode<string>("C");
temp.LChild.LChild = new BiTreeNode<string>("D");
temp.LChild.RChild = null;
temp.RChild.LChild = new BiTreeNode<string>("E");
temp.RChild.RChild = new BiTreeNode<string>("F");
temp.LChild.LChild.LChild = null;
temp.LChild.LChild.RChild = new BiTreeNode<string>("G");
//显示初始化的二叉树
Console.WriteLine("初始化的二叉树为:");
Console.WriteLine();
Console.WriteLine(" " + " " + " " + " " + "A");
Console.WriteLine(" " + " " + " " + " " + "*");
Console.WriteLine(" " + " " + " " + "*" + " " + "*");
Console.WriteLine(" " + " " + "*" + " " + " " + " " + "*");
Console.WriteLine(" " + " " + "B" + " " + " " + " " + "C");
Console.WriteLine(" " + " " + "*" + " " + " " + " " + "*");
Console.WriteLine(" " + "*" + " " + " " + " " + "* " + " " + "*");
Console.WriteLine("*" + " " + " " + " " + "*" + " " + " " + " " + " " + "*");
Console.WriteLine("D" + " " + " " + " " + "E" + " " + " " + " "+ " " +"F");
Console.WriteLine("*");
Console.WriteLine(" " + "*");
Console.WriteLine(" " + " "+"*");
Console.WriteLine(" " + " " + "G");
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine("先序遍历的结果为:");
string prestring = Program.PreOrder(p.Head);
Console.WriteLine(prestring);
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine("中序遍历的结果为:");
prestring = Program.MidOrder(p.Head);
Console.WriteLine(prestring);
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine("后序遍历的结果为:");
prestring = Program.AftOrder(p.Head);
Console.WriteLine(prestring);
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine("层次遍历的结果为:");
prestring = Program.LevOrder(p.Head);
Console.WriteLine(prestring);
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine("叶子节点的个数为:");
int conut =Program.CalCount(p.Head);
Console.WriteLine(conut.ToString());
Console.WriteLine("-------------------------------------------------------------------");
Console.WriteLine("二叉树的深度为:");
conut = Program.CalBitTreeHeight(p.Head);
Console.WriteLine(conut.ToString());
Console.ReadKey();
}
}
}
首次写博客 就写这么多吧 也算是留个脚印 ^_^