二叉树搜索树的概念,维基百科描述如下:
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树:
1.若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;
2.若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3.它的左、右子树也分别为二叉排序树。
简单的说,就是根节点比右边叶子结点大,但比左边叶子节点小。每一颗子树都如此。
往一个二叉搜索树中插入节点,算法描述如下:
如果该数一个结点都没有,那么先插入一个结点作为根结点。
如果有了,就看插入的结点比这个根结点大还是小,大么插右边,小么插左边,等于就不插。
插的时候看待插入的结点要插的这个位子是不是还空着,空着才能插。如果不空,比如被结点A占了,那么就把这个结点A作为根结点,再按照之前的方法再次插入一遍。
因此,很容易看出,这里存在递归。因此可以用递归方法实现。
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace tree
- {
- #region 节点的定义
- class node
- {
- public int nodevalue;
- public node leftchild, rightchild;
- public node()
- { }
- public node(int value)
- {
- nodevalue = value;
- }
- public void assignchild(node left, node right)//设定左右孩子
- {
- this.leftchild = left;
- this.rightchild = right;
- }
- public bool hasleftchild//是否有左孩子
- {
- get
- {
- return (leftchild != null);
- }
- }
- public bool hasrightchild//是否有右孩子
- {
- get
- {
- return (rightchild != null);
- }
- }
- public bool haschild//是否有右孩子
- {
- get
- {
- return hasleftchild || hasrightchild;
- }
- }
- }
- #endregion
- class Program
- {
- static void Main(string[] args)
- {
- node node_1 = new node(1);
- node node_2 = new node(2);
- node node_3 = new node(3);
- node node_4 = new node(4);
- node node_5 = new node(5);
- node node_6 = new node(6);
- node node_7 = new node(7);
- node node_8 = new node(8);
- node node_9 = new node(9);
- node node_10 = new node(10);
- node node_11 = new node(11);
- node node_12 = new node(12);
- node node_13 = new node(13);
- InsertIntoBST(node_6, node_12);//node_6作为根结点
- InsertIntoBST(node_6, node_5);
- InsertIntoBST(node_6, node_6);
- InsertIntoBST(node_6, node_9);
- InsertIntoBST(node_6, node_1);
- InsertIntoBST(node_6, node_7);
- InsertIntoBST(node_6, node_8);
- InsertIntoBST(node_6, node_3);
- InsertIntoBST(node_6, node_10);
- InsertIntoBST(node_6, node_4);
- InsertIntoBST(node_6, node_2);
- InsertIntoBST(node_6, node_11);
- preorder_visit_depth(node_6, 1,""); //先序遍历,附带打印深度和左右
- }
- //先序遍历 //DLR,附带打印深度和左右
- static void preorder_visit_depth(node Anode, int depth,string lr)
- {
- Console.WriteLine(Anode.nodevalue + "-depth:" + depth+lr);//打印出深度和左右
- depth++;
- if (Anode.hasleftchild)
- {
- preorder_visit_depth(Anode.leftchild, depth,"-left");
- }
- if (Anode.hasrightchild)
- {
- preorder_visit_depth(Anode.rightchild, depth,"-right");
- }
- }
- static void InsertIntoBST(node root, node leaf)
- {
- if (root == null)
- {
- root = leaf;
- return;
- }
- if (root.nodevalue == leaf.nodevalue)
- {
- return;
- }
- else if (root.nodevalue > leaf.nodevalue)
- {
- if (root.hasleftchild == false)
- {
- root.leftchild = leaf;
- }
- else
- {
- InsertIntoBST(root.leftchild,leaf);
- }
- }
- else if (root.nodevalue < leaf.nodevalue)
- {
- if (root.hasrightchild == false)
- {
- root.rightchild = leaf;
- }
- else
- {
- InsertIntoBST(root.rightchild, leaf);
- }
- }
- }
- }
- }
如果改变插入叶子节点的顺序,得到的树也是不一样的。例如下面的顺序。
- InsertIntoBST(node_6, node_5);
- InsertIntoBST(node_6, node_6);
- InsertIntoBST(node_6, node_4);
- InsertIntoBST(node_6, node_2);
- InsertIntoBST(node_6, node_7);
- InsertIntoBST(node_6, node_9);
- InsertIntoBST(node_6, node_1);
- InsertIntoBST(node_6, node_8);
- InsertIntoBST(node_6, node_12);
- InsertIntoBST(node_6, node_10);
- InsertIntoBST(node_6, node_3);
- InsertIntoBST(node_6, node_11);