二叉排序树的构建和插入

二叉排序树就是在一棵树中,满足每个结点的左子树结点都比它小,右子树结点比它大。

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就是最后访问到的节点和一个左右的标志,好确定新加的元素是最后节点的左还是右子节点。

需要注意的就是树为空的时候,直接跟根赋值就行了。


首页 我的博客
粤ICP备17103704号