我想用堆栈实现树的遍历,但为什么用getfirstchild和getnextchild取的节点地址是相同的?部分代码如下所示
        ln_node := ln_pnode.getFirstChild;
        while ln_node <> nil do
        begin
            ls_stack.Push(@ln_node);    //此处入栈地址为什么相同啊?   断点调试显示节点text属性以改变
            ln_node := ln_pnode.GetNextChild(ln_node);
        end;

解决方案 »

  1.   

    ln_node 的地址不会变呀,变得是他的地址中指向的内容
      

  2.   

    楼上说的不是很理解,这是完整代码,问题出在入栈时地址相同,那该怎么改啊?先谢啦!!
        ls_stack := TStack.Create;
        ln_pnode := bsSkinTreeView1.Items.GetFirstNode;
        ls_stack.Push(@ln_pnode);
        while ls_stack.count <> 0 do
        begin
            p := ls_stack.Pop;
            ln_pnode := TTreeNode(p^);
            ln_node := ln_pnode.getFirstChild;
            while ln_node <> nil do
            begin
                ls_stack.Push(@ln_node);   --调试时入栈地址相同
                ln_node := ln_pnode.GetNextChild(ln_node);
            end;
        end;
      

  3.   


    如果你是从C++转过来的,那我原谅你这么写,如果不是我BS你。ln_node是个函数内声明的局部变量吧,你对局部变量取地址,当然总不是不变了。难道你不知道ln_node: TTreeNode,实际是个指针?
      

  4.   

    另外我实在想不通你为什么要用stack来遍历树。用个递归就好了。
      

  5.   

    不知道你有没测试,用全局变量,也是一样的问题,其实小弟刚学delphi没多久  望指教...
      

  6.   

    treeview?
    直接treeview1.items[i]就行了
      

  7.   

    i:integer;
    p:Ttreenode;for i:=0 to tv.items.count-1 do
    begin
      p:=tv.items[i];
      干 遍历到一个节点后 该干的事
    end;
      

  8.   

    用递归我已经实现了树的深度遍历,在这里我觉得用堆栈的思路也很好,关键问题是不知道如何解决再次获取
    ln_pnode时,其子节点入栈时@ln_node为同一内存的问题。
      

  9.   

    直接:
    ls_stack.Push(ln_node);
      

  10.   

    Push内参数是pointer类型的啊。。
      

  11.   

    Ttreenode就是对象,也就是指针