- using System;
- using System.Text;
- namespace BinarySearchTree
- {
- class Node//二叉树结点数据类型
- {
- public string info;//数据
- public Node lchild;//左子树
- public Node rchild;//右子树
- public Node(string i, Node l, Node r)
- {
- info = i;
- lchild = l;
- rchild = r;
- }
- }
- class BinaryTree//二叉树基础操作操作类
- {
- public Node ROOT;//根结点
- int height;//数的高度
- public BinaryTree()
- {
- ROOT = null;
- }
- public void insert(string element)//插入元素
- {
- Node tmp, parent = null, currentNode = null;
- find(element, ref parent, ref currentNode);
- if (currentNode != null)//如果currentNode不为空值说明currentNode.info==element,是重复元素
- {
- Console.WriteLine("Duplicates words not allowed");
- return;
- }
- else//如果currentNode为空值时插入新结点
- {
- tmp = new Node(element, null, null);//tmp为新节点,lchild和rchild指正均为空
- if (parent == null)//如果parent结点为空,说明树为空,则tmp作为根结点
- ROOT = tmp;
- else
- if (string.Compare(element, parent.info) < 0)//如果parent不为空,则比较parent.info和element的大小
- parent.lchild = tmp;
- else
- parent.rchild = tmp;
- }
- }
- public void find(string element, ref Node parent, ref Node currentNode)//寻找元素
- {
- currentNode = ROOT;
- parent = null;
- while ((currentNode != null) && (currentNode.info != element))
- {//当currentNode指针所指的当前结点不为空时,或者当前结点的info不为element时循环
- parent = currentNode;//将parent指针指向currentNode指向的当前结点
- if (string.Compare(element, currentNode.info) < 0)
- currentNode = currentNode.lchild;//element比current.info小时,将currentNode指向左子树
- else
- currentNode = currentNode.rchild;
- }
- }
- public void delete(string element)//删除元素
- {
- Node parent = null, currentNode = null;
- find(element,ref parent,ref currentNode);
- if (currentNode != null)//找到目标结点
- {
- if (currentNode.lchild == null && currentNode.rchild == null)//如果目标结点的左子树和右子树均为空
- {
- if (parent == null)//如果目标结点为根结点
- ROOT = null;
- //Release currentNode
- else
- {
- if (parent.lchild == currentNode)
- parent.lchild = null;
- else
- parent.rchild = null;
- //Release currentNode
- }
- }
- else if ((currentNode.lchild == null && currentNode.rchild != null)
- || (currentNode.lchild != null && currentNode.rchild == null))//如果目标结点有一棵子树
- {
- if (parent == null)
- {
- if (currentNode.lchild!=null)
- ROOT = currentNode.lchild;
- else
- ROOT = currentNode.rchild;
- //Release currentNode
- }
- else
- {
- if (parent.lchild == currentNode)
- if (currentNode.lchild != null)
- parent.lchild = currentNode.lchild;
- else
- parent.lchild = currentNode.rchild;
- else
- if (currentNode.lchild != null)
- parent.rchild = currentNode.lchild;
- else
- parent.rchild = currentNode.rchild;
- //Release currentNode
- }
- }
- else if (currentNode.lchild != null && currentNode.rchild != null)//如果目标结点有两颗子树
- {
- Node inorder_suc = currentNode.rchild;
- parent = currentNode;
- while (inorder_suc.lchild != null)//寻找currentNode右子树的最左子树
- {
- parent = inorder_suc;
- inorder_suc = inorder_suc.lchild;
- }
- currentNode.info = inorder_suc.info;
- if (inorder_suc.lchild == null && inorder_suc.rchild == null)//如果inorder_suc的左子树和右子树均为空
- {
- if (parent.lchild == inorder_suc)
- parent.lchild = null;
- else
- parent.rchild = null;
- //Release currentNode
- }
- if (inorder_suc.lchild == null || inorder_suc.rchild == null)//如果inorder_suc有一棵子树
- {
- if (parent.lchild == inorder_suc)
- if (inorder_suc.lchild != null)
- parent.lchild = inorder_suc.lchild;
- else
- parent.lchild = inorder_suc.rchild;
- else
- if (inorder_suc.lchild != null)
- parent.rchild = inorder_suc.lchild;
- else
- parent.rchild = inorder_suc.rchild;
- //Release currentNode
- }
- }
- }
- }
- //public void inorder(Node ptr)//中序遍历二叉树
- //{
- // if (ROOT == null)
- // {
- // Console.WriteLine("Tree is empty");
- // return;
- // }
- // if (ptr != null)
- // {
- // inorder(ptr.lchild);
- // Console.Write(ptr.info + " ");
- // inorder(ptr.rchild);
- // }
- //}
- //public void preorder(Node ptr)//先序遍历二叉树
- //{
- // if (ROOT == null)
- // {
- // Console.WriteLine("Tree is empty");
- // return;
- // }
- // if (ptr != null)
- // {
- // Console.Write(ptr.info + " ");
- // preorder(ptr.lchild);
- // preorder(ptr.rchild);
- // }
- //}
- //public void postorder(Node ptr)//后序遍历二叉树
- //{
- // if (ROOT == null)
- // {
- // Console.WriteLine("Tree is empty");
- // return;
- // }
- // if (ptr != null)
- // {
- // postorder(ptr.lchild);
- // postorder(ptr.rchild);
- // Console.Write(ptr.info + " ");
- // }
- //}
- public int getheight(Node ptr)//求树的高度
- {
- int lHeight = 0, rHeight = 0;
- if (ROOT == null)
- return 0;
- else
- {
- if (ptr != null)
- {
- lHeight = getheight(ptr.lchild);
- rHeight = getheight(ptr.rchild);
- return (lHeight > rHeight ? lHeight + 1 : rHeight + 1);
- }
- else
- return 0;
- }
- }
- public void printtree(Node ptr,int level)//输出二叉树
- {
- if (ptr == null)
- return;
- else
- {
- if (ptr.rchild != null)
- printtree(ptr.rchild, level + 1);
- for (int i = 0; i < level; i++)
- Console.Write(" ");
- Console.WriteLine(ptr.info);
- if (ptr.lchild != null)
- printtree(ptr.lchild, level + 1);
- }
- }
- static void Main(string[] args)
- {
- BinaryTree b = new BinaryTree();
- while (true)
- {
- Console.Clear();
- b.height = b.getheight(b.ROOT);
- Console.WriteLine("the height of tree:{0}", b.height);
- Console.WriteLine("Print binary tree:");
- b.printtree(b.ROOT, 1);
- Console.WriteLine("/nMenu");
- Console.WriteLine("1. Implement insert operation");
- Console.WriteLine("2. Implement delete operation");
- Console.WriteLine("3. Exit");
- Console.Write("/nEnter your Choice:");
- char ch = Convert.ToChar(Console.ReadLine());
- switch (ch)
- {
- case '1':
- {
- Console.Write("Enter a word: ");
- string word = Console.ReadLine();
- b.insert(word);
- }
- break;
- case '2':
- {
- Console.Write("Enter a word: ");
- string word = Console.ReadLine();
- b.delete(word);
- }
- break;
- case '3':
- return;
- default:
- Console.WriteLine("Invalid option");
- break;
- }
- }
- }
- }
- }