如何将树转换为线程二叉树

时间:2016-05-30 11:37:47

标签: delphi pointers tree binary-tree binary-search-tree

我有一个用于创建二叉树及其递归输出的代码。如何将二叉树转换为线程树并迭代打印?

type
  PAvl = ^TAvl;
  TAvl = record
           key: integer;
           left: PAvl;
           right: PAvl;
           isThreaded: boolean;
         end;

procedure create(var root: PAvl; digit: integer);
begin
  if root = nil then begin
    New(root);
    root^.key := digit;
    root^.left := nil;
    root^.right := nil;
  end
  else if root.key > digit then
    create(root.left, digit)
  else 
    create(root.right, digit);
end;

procedure Print(root: PNode; depth: integer = 0);
var 
  i: integer;
begin
  if root <> nil then
  begin
    Print(root^.right, depth + 1);
    for i:=1 to depth do 
      Write(#9);
    Writeln(root^.data);
    Print(root^.left, depth + 1);
  end;
end;

1 个答案:

答案 0 :(得分:1)

答案就像你做的那样简单直接。 (双关语)你事先决定你喜欢哪种遍历方法。孩子先或自己先。然后你进行遍历,设置链接。基本上你然后实现了树和链表。

更难的问题是保持野兽平衡。拥有链表和节点数有助于此。提示,我会使用递归函数来查找列表的中间部分,使其成为新的叶子节点(如果没有节点存在则为root),然后将自我修剪出临时左链和临时右链。调用每个临时链上的函数以获取子节点。

对于大多数不涉及搜索优化的实现,您将希望指向父级而不是让节点指向子级。这允许给定父母的任何n个孩子。如果需要,可以使子列表成为一个参差不齐的数组或链表。因此,最后您将搜索链与其他数据结构相结合,以获得结果。

当然,问自己的另一件事是实施是否保证一切都在记忆中。很多时候,如果数据库存在,那么让数据库完成工作要好得多。

祝福。好问题。