二叉排序树就是在一棵树中,满足每个结点的左子树结点都比它小,右子树结点比它大。
class Program
{
class Node
{
public int data;
public Node cLeft;
public Node cRight;
}
static void Main(string[] args)
{
int[] datas = { 9,2,6,3,1,22,8,55,77,33 };
Node head = null;
CreateOrderTree(ref head, datas);
PrintMid(head);//1 2 3 6 8 9 22 33 55 77
Console.ReadKey();
}
static void CreateOrderTree(ref Node head, int[] datas)
{
if (datas.Length < 1) return;
for (int i = 0; i < datas.Length; i++)
{
Insert(ref head, datas[i]);
}
}
//插入
static void Insert(ref Node head, int data)
{
if (head == null)
{
head = new Node();
head.data = data;
return;
}
Node temp = head;
Node preTemp = temp;
bool isLeft = false;
while (temp != null)
{
preTemp = temp;//访问到的最后一个节点,temp是空的
if (data < temp.data)
{
//左边
isLeft = true;
temp = temp.cLeft;
}
else if (data > temp.data)
{
isLeft = false;
temp = temp.cRight;
}
else
{
//重复的数据
return;
}
}
Node node = new Node();
node.data = data;
if (isLeft)
{
preTemp.cLeft = node;
}
else
{
preTemp.cRight = node;
}
}
//中序遍历输出
static void PrintMid(Node node)
{
if (node == null) return;
PrintMid(node.cLeft);
Console.Write(node.data + " ");
PrintMid(node.cRight);
}
}创建一个二叉排序树主要时调用插入方法构建而成的,所以主要的是插入方法,插入方法很简单,都是从树的根开始,每次从根部对比元素,小的往左走,大的往右走,直到为空位置,而这个空的位置就是该元素的位置,所有要保留一个PreNode就是最后访问到的节点和一个左右的标志,好确定新加的元素是最后节点的左还是右子节点。
需要注意的就是树为空的时候,直接跟根赋值就行了。