关于遍历二叉树的C ++设计问题

时间:2010-04-05 15:24:26

标签: c++ algorithm binary-tree tree-traversal

我有一个二叉树T,我想复制到另一棵树。

假设我有一个在每个节点都得到评估的访问方法:

struct visit 
{
 virtual void operator() (node* n)=0;

};

我有访问者算法

void visitor(node* t, visit& v)
{
//do a preorder traversal using stack or recursion
 if (!t) return;
 v(t);
 visitor(t->left, v);
 visitor(t->right, v);

}

我有两个问题:

  1. 我决定使用基于仿函数的方法,因为我看到boost图表执行此操作(顶点访问者)。此外,我倾向于重复相同的代码来遍历树并做不同的事情 在每个节点。这是一个摆脱重复代码的好设计吗?还有哪些其他替代设计?
  2. 如何使用它从现有二进制树创建新的二叉树?我可以保持堆叠 如果我愿意,可以访问仿函数,但它会与访问者中的算法绑定。
  3. 我如何在此处加入延期交易?另一个函子类?

2 个答案:

答案 0 :(得分:1)

3:为您想要执行的每种类型的遍历创建其他方法并重新排列访问者呼叫:

void preorder_visitor(node* t, visit& v)
{
 if (!t) return;
 v(t);
 visitor(t->left, v);
 visitor(t->right, v);
}

void postorder_visitor(node* t, visit& v)
{
 if (!t) return;
 visitor(t->left, v);
 visitor(t->right, v);
 v(t);
}

答案 1 :(得分:0)

  1. 对访问者进行子类化,并为每个单独的任务提供不同的访问者,并将类似(或相关)的任务合并到同一个访问者中。最好的方法很大程度上取决于您尝试做什么。
  2. 访客可以构建不同的树。当它访问节点时,它会构建新的节点副本并以“正确”的顺序链接它们。
  3. 您重写了访问节点的顺序。
  4. 访客是一种技巧。看起来您已经将该技术与特定解决方案混淆了。使用访问者意味着某些导航服务由数据结构提供,该数据结构将通过回调与外部对象(访问者)通信。