procedure creattree(var p:biptr);
var ch:char;
q:biptr;
begin
  read(ch);
  if ch<>'*' then begin
    new(q); q^.data:=CH;q.lc:=nil;q.rc:=nil;
    p:=q;q:=nil;dispose(p);
    creattree(p^.lc);
    creattree(p^.rc);
    end
    else p:=nil;
end;

解决方案 »

  1.   

    procedure creattree(var p:biptr);
    var ch:char;
    q:biptr;
    begin
      read(ch);
      if ch<>'*' then begin
        new(q); q^.data:=CH;q.lc:=nil;q.rc:=nil;
        p:=q;q:=nil;dispose(q);
        creattree(p^.lc);
        creattree(p^.rc);
        end
        else p:=nil;
    end;
      

  2.   

    你这棵二叉树生成程序是对的,但是输入上有问题。
    你的creattree是通过先根遍历序列来生成树。你调试的时候总也是见不到输出结果吧?因为程序总是等待你的输入,这个原因很简单。你看看你的CreateTree,如果要中止递归,只有输入为*,但是每次递归的结果都产生两个相同的递归分支,也就是说必须要输入叶子的两倍的*,才能结束递归。
    具体地说,对于树
    a -- b
    |
    +--- c
    如果你输入abc*,那么程序会认为是这样的树
    a -- b -- c -- *
              |
              +--- ?
    然后等待你输入?的内容
    所以你必须输入
    ab**c**
    才能得到结果,程序识别过程如下:
    a -- b -- *
    |    |
    |    +--- *
    |
    +--- c -- *
         |
         + -- *
      

  3.   

    就是你原来的程序不变啊
    procedure output(p:biptr);
    begin
    if p<>nil then begin
      writeln (p^.data);
      output(p^.lc);
      output(p^.rc);
    end;
    end; <---这里少了一个end;然后你输入ab**c**回车
    得到输出:
    a
    b
    c
      

  4.   

    具体点说吧,你可能还是没有明白我的意思。比如你要生成这样的二叉树:
    a--c--e
    |  |
    |  d--f
    b你应该先把缺少了左或者右的节点补上*,变成
    a--c--e--*
    |  |
    |  d--f--*
    |  |
    |  *
    |
    f--*
    |
    *
    执行程序的时候,输入上面加了*的树的先根遍历,也就是:
    ab**cd*f**e**回车
    就可以得到输出了,输出是先根遍历没有*号,也就是:
    a
    b
    c
    d
    f
    e明白了吧?
    呵呵,我可够累的,你也应该多给我点分数啊 :)
      

  5.   

    to:jarjarbink(答案丢了) 请继续关注:
    http://www.csdn.net/expert/topic/509/509751.shtm