如何在窗体上实现数据结构里讲的二叉树,即我在向edit框输入一些数值(A,B,C,D,E,F,G,H ),然后在窗体上生成如下的树,    
         A
     B       C 
  D     E  F    G
H要求上面的树,结点值是在圆圈里,结点与结点之间用线连接起来这要怎么实现,谢谢~~~

解决方案 »

  1.   

    用 treeview 吧。。
      

  2.   

    Mlbl:=TLabel.Create(self);
      Mlbl.Caption :=LBCaption
      Mlbl.Top :=Iheight;
      Mlbl.Left:=IWidth ;
      Mlbl.Parent:=form1;
      Mlbl.Show ;
    这种建立一个动态的Label也可以实现,不过要有个算法!
    可以建立一个先从edit1中读取字符串形成数组的函数比如说删除edit中的,号来组成的函数
    然后计算这个数组中的Heigh,看是I的平方的差值多少,如果是其实就是平方和的值!来决定需要几行!然后给出动态建立的Label赋值
      

  3.   

    uses Math;type
      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;