树是一种非线性结构。树的本质是将一些节点由边连接起来,形成层级的结构。而二叉树是一种特殊的树,使得树每个子节点必须小于等于2.而二叉查找树又是一类特殊的二叉树。使得每一个节点的左节点或左子树的所有节点必须小于这个节点,右节点必须大于这个节点。从而方便高效搜索。
二叉查找树是节点的集合。因此首先要构建节点,如代码1所示。
public void DisplayData()
构建二叉树是通过向二叉树插入元素得以实现的,所有小于根节点的节点插入根节点的左子树,大于根节点的,插入右子树。依此类推进行递归。直到找到位置进行插入。二叉查找树的构建过程其实就是节点的插入过程。C#实现代码如代码2所示。
public void Insert(int data)
if(newNode.data<Current.data)
二叉树的遍历分为先序(PreOrder),中序(InOrder)和后序(PostOrder)。先序首先遍历根节点,然后是左子树,然后是右子树。中序首先遍历左子树,然后是根节点,最后是右子树。而后续首先遍历左子树,然后是右子树,最后是根节点。因此,我们可以通过C#递归来实现这三种遍历,如代码3所示。
public void InOrder(Node theRoot)
public void PreOrder(Node theRoot)
public void PostOrder(Node theRoot)
PostOrder(theRoot.right);
二叉查找树因为已经有序,所以查找最大值和最小值非常简单,找最小值只需要找最左边的叶子节点即可。而找最大值也仅需要找最右边的叶子节点,如代码4所示。
while (current.right != null)
Console.WriteLine("\n最大节点为:" + current.data);
while (current.left != null)
Console.WriteLine("\n最小节点为:" + current.data);
因为二叉查找树已经有序,所以查找时只需要从根节点开始比较,如果小于根节点,则查左子树,如果大于根节点,则查右子树。如此递归,如代码5所示。
public Node Search(int i)
if (current.left == null)
else if (i > current.data)
我们首先需要找到被删除的节点和其父节点,然后根据上述四种情况分别处理。如果遇到被删除元素是根节点时,还需要特殊处理。如代码6所示。
public Node Delete(int key)
if (current.left == null)
else if (key > current.data)
if (current.left == null && current.right == null)
if (current == rootNode&&rootNode.left==null&&rootNode.right==null)
else if (current.data < parent.data)
else if(current.left!=null&¤t.right==null)
if (current.data < parent.data)
parent.left = current.left;
parent.right = current.left;
else if (current.left == null && current.right != null)
if (current.data < parent.data)
parent.left = current.right;
parent.right = current.right;
//current是被删的节点,temp是被删左子树最右边的节点
if (current.data < parent.data)
parent.left = current.left;
while (temp.right != null)
temp.right = current.right;
else if (current.data > parent.data)
parent.right = current.left;
while (temp.left != null)
temp.right = current.right;
while (temp.right != null)
temp.right = rootNode.right;
现在我们已经完成了二叉查找树所需的各个功能,下面我们来对代码进行测试:
BinarySearchTree b = new BinarySearchTree();
Console.Write("\n中序遍历为:");
Console.Write("\n先序遍历为:");
Console.Write("\n后序遍历为:");
Console.WriteLine("\n所查找的节点为" + x.data);
Console.Write("\n删除节点后先序遍历的结果是:");
Console.Write("\n删除根节点后先序遍历的结果是:");
树是节点的层级集合,而二叉树又是将每个节点的孩子限制为小于等于2的特殊树,二叉查找树又是一种特殊的二叉树。二叉树对于查找来说是非常高效,尤其是查找最大值和最小值。
本文转自CareySon博客园博客,原文链接:http://www.cnblogs.com/CareySon/archive/2012/04/19/ImpleBinaryTreeWithCSharp.html,如需转载请自行联系原作者