二叉排序树就是在一棵树中,满足每个结点的左子树结点都比它小,右子树结点比它大。
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就是最后访问到的节点和一个左右的标志,好确定新加的元素是最后节点的左还是右子节点。
需要注意的就是树为空的时候,直接跟根赋值就行了。