C# 二叉查找树实现

BuildTree 代码1次CODE完,没有BUG.

在画图地方debug了很多次.第一次画这种图.

一开始用treeview显示,但发现不是很好看出树结构,于是自己动手画了出来.

  1 using System;
  2 using System.Collections.Generic;
  3 using System.ComponentModel;
  4 using System.Data;
  5 using System.Drawing;
  6 using System.Linq;
  7 using System.Text;
  8 using System.Windows.Forms;
  9
 10 namespace 二叉查找树
 11 {
 12     public partial class Form1 : Form
 13     {
 14         public Form1()
 15         {
 16             InitializeComponent();
 17
 18            //BuildTreeView(topNode , treeView1.Nodes);
 19            treeView1.Visible = false;
 20         }
 21         BNode<int> topNode;
 22         private void Form1_Click(object sender, EventArgs e)
 23         {
 24             var lastNode = RandomGenBSPTree(50);
 25             topNode = lastNode.GetTopNode();
 26             //r1 += 0.1f;
 27             DrawTree(topNode, 1);
 28
 29             maxLevel = dicLevel.Count;
 30             Bitmap b = new Bitmap((marginX + blockWidth) * maxLevel, (marginY + blockHeight) * maxLevel);
 31             var g = Graphics.FromImage(b);
 32             g.Clear(Color.Black);
 33             DrawTree2(topNode, g, b.Width / 2 - blockWidth / 2, 20,false,true);
 34             DrawTree3(topNode, g);
 35             int minI=0,maxI = 0;
 36             for (int i = 0; i < b.Width; i++)
 37             {
 38                 for (int y = 0; y < b.Height; y++)
 39                 {
 40                     if (b.GetPixel(i, y).R != 0 || b.GetPixel(i, y).G != 0 || b.GetPixel(i, y).B != 0)
 41                         goto QUITMAXI;
 42                 }
 43                 minI = i;
 44             }
 45         QUITMAXI:
 46             for (int i = 0; i < b.Width-minI; i++)
 47             {
 48                 int id=b.Width - 2 - i;
 49                 int ct = 0;
 50                 for (int y = 0; y < b.Height; y++)
 51                 {
 52                     if (b.GetPixel(id, y).R != 0 || b.GetPixel(id, y).G != 0 || b.GetPixel(id, y).B != 0)
 53                         ct++;
 54                     if(ct>50)
 55                         goto QUITMIN;
 56                 }
 57                 maxI = id;
 58             }
 59         QUITMIN:
 60             Bitmap bmpOut = new Bitmap(maxI-minI, b.Height);
 61             Graphics g2 = Graphics.FromImage(bmpOut);
 62             g2.DrawImage(b, new Rectangle(0, 0, bmpOut.Width, bmpOut.Height), new Rectangle(minI-20, 0, maxI, b.Height), GraphicsUnit.Pixel);
 63
 64             this.BackgroundImage = bmpOut;
 65         }
 66
 67         void BuildTreeView(BNode<int> node,TreeNodeCollection tn)
 68         {
 69             if (node == null) return;
 70            var newNode= tn.Add(node.value.ToString());
 71            BuildTreeView(node.left, newNode.Nodes);
 72            BuildTreeView(node.right, newNode.Nodes);
 73         }
 74         int blockWidth = 300;
 75         int minBlockWidth = 10;
 76         int blockHeight = 40;
 77         int marginX = 10;
 78         int marginY = 10;
 79         int maxLevel = 0;
 80         Font font = new Font("宋体",12,FontStyle.Bold);
 81         Brush brush = new SolidBrush(Color.White);
 82         Dictionary<int, List<BNode<int>>> dicLevel = new Dictionary<int, List<BNode<int>>>();
 83         void DrawTree(BNode<int> node,int level)
 84         {
 85             if (node == null) return;
 86             if (dicLevel.ContainsKey(level) == false)
 87             dicLevel.Add(level,new List<BNode<int>>());
 88             dicLevel[level].Add(node);
 89             node.level = level;
 90             DrawTree(node.left,level+1);
 91             DrawTree(node.right, level + 1);
 92         }
 93
 94         void DrawTree2(BNode<int> node , Graphics g,int x,int y , bool isLeft=false,bool isRoot=false)
 95         {
 96             if (node == null) return;
 97
 98             if (isRoot){
 99                 g.DrawString(node.value.ToString(), font, brush, x, y);
100                 node.pos = new Point(x, y);
101             }
102             else
103             {
104
105                 Text = r1.ToString();
106                 var rate = (int)(blockWidth  - r1*Math.Pow(node.level,2) * marginX);
107                 rate = rate < minBlockWidth ? minBlockWidth : rate;
108                 node.pos = new Point(x + (isLeft ? -1 : 1) * (rate), y + blockHeight + marginY);
109                 g.DrawString(node.value.ToString(), font, brush, node.pos.X, node.pos.Y);
110             }
111
112             DrawTree2(node.left, g, node.pos.X, node.pos.Y, true);
113             DrawTree2(node.right, g, node.pos.X, node.pos.Y, false);
114         }
115         float r1=1f;
116         void DrawTree3(BNode<int> node, Graphics g)
117         {
118             if (node == null) return;
119             if (node.left != null)
120                 g.DrawLine( new Pen(Color.Green,2.1f),node.pos,node.left.pos);
121             if (node.right != null)
122                 g.DrawLine(new Pen(Color.Green, 2.1f), node.pos, node.right.pos);
123             DrawTree3(node.left , g);
124             DrawTree3(node.right, g);
125         }
126
127         BNode<int> RandomGenBSPTree(int Count)
128         {
129             var r = new Random();
130             List<int> pool = new List<int>();
131
132             BNode<int> curNode = new BNode<int>();
133             curNode.value = 50;
134             pool.Add(curNode.value);
135             for (int i = 0; i < Count; i++)
136             {
137                 do
138                 {
139                     var newValue = r.Next(1, 100);
140                     if (pool.Contains(newValue) == false)
141                     {
142                         pool.Add(newValue);
143                         break;
144                     }
145
146                 }while(true);
147
148                 curNode.Insert(pool[pool.Count-1]);
149             }
150             return curNode;
151         }
152
153         class BNode<T>where T:IComparable
154         {
155             public BNode<T> left;
156             public BNode<T> right;
157             public BNode<T> parent;
158             public T value;
159             public int level;
160             public string text;
161             public Point pos;
162             public void Insert(T v)
163             {
164                 var firstCompare=v.CompareTo( value );
165                 BNode<T> nextCompare=firstCompare<0?left:right;
166
167                 if (nextCompare != null)
168                 {
169                     nextCompare.Insert(v);
170                 }
171                 else
172                 {
173                     if (firstCompare < 0)
174                         left = new BNode<T> { parent=this, value=v };
175                     else
176                         right = new BNode<T> { parent = this, value = v };
177                 }
178             }
179
180             public BNode<T> GetTopNode()
181             {
182                 if (parent != null)
183                     return parent.GetTopNode();
184                 else
185                     return this;
186             }
187         }
188
189     }
190 }
时间: 2024-12-30 12:06:00

C# 二叉查找树实现的相关文章

C语言实现二叉查找树

#include<stdio.h> #include<stdlib.h> /* * 数据结构:二叉查找树,即左孩子<父节点<右孩子 * C语言实现 * 2015-9-13 */ typedef struct TreeNode *PtrToNode; typedef PtrToNode Tree; typedef PtrToNode Position; struct TreeNode { int Element; Tree Left; //节点左孩子 Tree Right

按层遍历二叉查找树

<算法>中二叉查找树一节的习题:按层遍历二叉查找树. 可以使用队列来管理二叉查找树中的节点,节点按照如下方法入队出队: 节点x入队 当队列不为空时使用队列的第一个元素first 如果节点first.left不为空则将fisrt.left入队 如果节点first.right不为空则将first.right入队 将first节点出队 /** * Created by elvalad on 2014/12/5. * 按层遍历二叉查找树 */ import java.util.Iterator; im

二叉查找树BST 模板

二叉查找树BST 就是二叉搜索树 二叉排序树. 就是满足 左儿子<父节点<右儿子 的一颗树,插入和查询复杂度最好情况都是logN的,写起来很简单. 根据BST的性质可以很好的解决这些东西 1.查询值 int Search(int k,int x) { if(x<a[k].key && a[k].l) Search(a[k].l,x); else if(x>a[k].key && a[k].r) Search(a[k].r,x); else retur

二叉查找树

二叉查找(搜索)树(Binary Search Tree)又称二叉排序树(Binary Sort Tree),是基于二叉树,BST具有下列性质:1.若左子树不空,则其左子树上的所有结点的值均小于根结点的值:2.若右子树不空,则其右子树上的所有结点的值均大于根结点的值:3.左.右子树也分别为二叉查找树. 结点类 public class BinaryNode {      Integer data;      BinaryNode leftChild;      BinaryNode rightC

平衡树初阶——AVL平衡二叉查找树+三大平衡树(Treap + Splay + SBT)模板【超详解】

平衡树初阶——AVL平衡二叉查找树 一.什么是二叉树 1. 什么是树. 计算机科学里面的树本质是一个树状图.树首先是一个有向无环图,由根节点指向子结点.但是不严格的说,我们也研究无向树.所谓无向树就是将有向树的所有边看成无向边形成的树状图.树是一种递归的数据结构,所以我们研究树也是按照递归的方式去研究的. 2.什么是二叉树. 我们给出二叉树的递归定义如下: (1)空树是一个二叉树. (2)单个节点是一个二叉树. (3)如果一棵树中,以它的左右子节点为根形成的子树都是二叉树,那么这棵树本身也是二叉

java 二叉查找树

//接口+抽象类+实现类package wangChaoPA实习工作练习.com.进阶篇.二叉查找树; import java.util.Iterator;public interface Tree<E extends Comparable<E>>{    // 从树中删除e    boolean delete(E e); // 树的大小    int getSize(); // 中序遍历树    void inorder(); // 把e插入到tree中    boolean i

二叉查找树C++实现

二分查找树特点: (1) 若任意节点的左子树不空,则左子树上所有结点的值均小于它的根结点的值: (2) 任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值: (3) 任意节点的左.右子树也分别为二叉查找树. (4) 没有键值相等的节点(no duplicate nodes). 前序遍历:中左右 中序遍历:左中右 序遍历:左右中 二叉查找树的重点在于如何找节点的前驱节点和后继节点 #pragma once #include <iostream> using namespace st

[二叉查找树] 二叉排序树

题目描述 输入一系列整数,建立二叉排序数,并进行前序,中序,后序遍历. 输入 输入第一行包括一个整数n(1<=n<=100).接下来的一行包括n个整数. 输出 可能有多组测试数据,对于每组数据,将题目所给数据建立一个二叉排序树,并对二叉排序树进行前序.中序和后序遍历.每种遍历结果输出一行.每行最后一个数据之后有一个空格. 样例输入 1 2 2 8 15 4 21 10 5 39 样例输出 2 2 2 8 15 8 15 15 8 21 10 5 39 5 10 21 39 5 10 39 21

图解数据结构(7)——二叉查找树及平衡二叉查找树(一共14篇)

这篇将是最有难度和挑战性的一篇,做好心理准备!十.二叉查找树(BST)前一篇介绍了树,却未介绍树有什么用.但就算我不说,你也能想得到,看我们Windows的目录结构,其实就是树形的,一个典型的分类应用.当然除了分类,树还有别的作用,我们可以利用树建立一个非常便于查找取值又非常便于插入删除的数据结构,这就是马上要提到的二叉查找树(Binary Search Tree),这种二叉树有个特点:对任意节点而言,左子(当然了,存在的话)的值总是小于本身,而右子(存在的话)的值总是大于本身. 这种特性使得我

二叉查找树 _ 二叉排序树 _ 二叉搜索树_C++

一.数据结构背景+代码变量介绍 二叉查找树,又名二叉排序树,亦名二叉搜索树 它满足以下定义: 1.任意节点的子树又是一颗二叉查找树,且左子树的每个节点均小于该节点,右子树的每个节点均大于该节点. 2.由1可推出,任意节点的左孩子小于该节点,右孩子大于该节点 以上讨论的是左(右)孩子(子树)存在的情况 它的中序遍历是一个升序的排序 在参考代码中,我们定义有: 主程序中,k代表插入或删除或查找的节点的值 root,根节点位置:a[i],第 i 号节点的值:cl[i],第 i 号节点左孩子的位置:cr