如何在窗体上实现数据结构里讲的二叉树,即我在向edit框输入一些数值(A,B,C,D,E,F,G,H ),然后在窗体上生成如下的树,
A
B C
D E F G
H要求上面的树,结点值是在圆圈里,结点与结点之间用线连接起来这要怎么实现,谢谢~~~
A
B C
D E F G
H要求上面的树,结点值是在圆圈里,结点与结点之间用线连接起来这要怎么实现,谢谢~~~
解决方案 »
- 问个字符串格式化的弱智问题,-_-!!!
- 程序员有没有喜欢火影的,有的话就加群8214435
- 如何生成可逆转的乱码?
- 想把blob size 修改得大一些,打开bde管理器,意外发现不能修改该项(默认32),后台sqlserver2000?
- 高分列出本机上所有SQLServer数据库名称?马上给分
- 一个比较简单的数据更新问题,在线等待
- 我也不知道怎么找到的这个地方……
- 一个报表的问题
- sos : 如何实现从一个treeview 到另外一个treeview的节点(带子节点)的拖动问题?
- delphi 从变量中解析XML
- 11
- 这几天我的可用分,怎么一直没增加?是不是因为这个?http://community.csdn.net/Expert/topic/3069/3069678.xml?temp=.4146692
Mlbl.Caption :=LBCaption
Mlbl.Top :=Iheight;
Mlbl.Left:=IWidth ;
Mlbl.Parent:=form1;
Mlbl.Show ;
这种建立一个动态的Label也可以实现,不过要有个算法!
可以建立一个先从edit1中读取字符串形成数组的函数比如说删除edit中的,号来组成的函数
然后计算这个数组中的Heigh,看是I的平方的差值多少,如果是其实就是平方和的值!来决定需要几行!然后给出动态建立的Label赋值
PNode = ^TNode;
TNode = record
rLeft: PNode;
rRight: PNode;
rData: string;
end;function NodeLevelCount(mNode: PNode): Integer;
begin
Result := 0;
if mNode = nil then Exit;
Result := 1 + Max(NodeLevelCount(mNode^.rLeft), NodeLevelCount(mNode^.rRight));
end; { NodeLevelCount }procedure AddNode(var nRoot: PNode; mData: string);
var
vFindFlag: Boolean; procedure pScanLevel(var nNode: PNode; mCurrLevel: Integer;
mDestLevel: Integer);
begin
if vFindFlag then Exit;
if mCurrLevel >= mDestLevel then
begin
if nNode = nil then begin
AddNode(nNode, mData);
vFindFlag := True;
end;
Exit;
end;
pScanLevel(nNode^.rLeft, mCurrLevel + 1, mDestLevel);
pScanLevel(nNode^.rRight, mCurrLevel + 1, mDestLevel);
end;
var
I: Integer;
begin
if nRoot = nil then
begin
New(nRoot);
nRoot^.rLeft := nil;
nRoot^.rRight := nil;
nRoot^.rData := mData;
Exit;
end;
vFindFlag := False;
I := 1;
repeat
pScanLevel(nRoot, 1, I);
Inc(I);
until vFindFlag;
end; { AddNode }procedure FreeNode(var nRoot: PNode);
begin
if nRoot = nil then Exit;
FreeNode(nRoot^.rLeft);
FreeNode(nRoot^.rRight);
Dispose(nRoot);
nRoot := nil;
end; { FreeNode }const
cWidth = 200;
cHeight = 200;procedure PaintNode(mCanvas: TCanvas; mRoot: PNode;
mLevel: Integer; mLevelCount: Integer; mLeft: Integer; mWidth: Integer;
mParentPoint: TPoint);
begin
if mCanvas = nil then Exit;
if mRoot = nil then Exit;
mCanvas.Pen.Color := clRed;
if mLevel > 1 then
mCanvas.MoveTo(mParentPoint.X, mParentPoint.Y);
mParentPoint := Point(mLeft + mWidth, Trunc(mLevel / mLevelCount * cHeight));
if mLevel > 1 then
mCanvas.LineTo(mParentPoint.X, mParentPoint.Y);
PaintNode(mCanvas, mRoot^.rLeft, mLevel + 1, mLevelCount,
mLeft - mWidth div mLevelCount, mWidth div 2,
Point(mLeft + mWidth, Trunc(mLevel / mLevelCount * cHeight)));
PaintNode(mCanvas, mRoot^.rRight, mLevel + 1, mLevelCount,
mLeft + mWidth + mWidth div mLevelCount, mWidth div 2,
Point(mLeft + mWidth, Trunc(mLevel / mLevelCount * cHeight)));
mCanvas.TextOut(mParentPoint.X, mParentPoint.Y, mRoot^.rData);
end; { PaintNode }procedure TForm1.Button1Click(Sender: TObject);
var
vRoot: PNode;
I: Integer;
begin
vRoot := nil;
with TStringList.Create do try
Delimiter := ',';
DelimitedText := Edit1.Text;
for I := 0 to Count - 1 do
AddNode(vRoot, Strings[I]);
finally
Free;
end;
Canvas.FillRect(Canvas.ClipRect);
PaintNode(Canvas, vRoot, 1, NodeLevelCount(vRoot), cWidth div 2, cWidth,
Point(0, 0));
FreeNode(vRoot);
end;