任务:将服务器端二叉树传输到客户端。
我在接受采访时得到了这个任务。有没有有效的方法来做到这一点? 我自己并不了解这项任务。
这是我提出的,但不确定服务器到客户端的转移。有什么想法吗?
void copyInOrder(TNode *orgTree, Tnode *& copyTree)
{
if(orgTree !=NULL){
//left side
TNode newLeftNode = cloneNode(orgTree->left_link);
copyTree->left_link = newLeftNode;
copyInOrder(orgTree->left_link, copyTree->left_link);
//right side
TNode newRightNode = cloneNode(orgTree->right_link);
copyTree->right_link = newRightNode;
copyInOrder(orgTree->right_link, copyTree->right_link);
}
}
答案 0 :(得分:3)
老实说,定义“有效”将是一个良好的第一步。重要的是什么?网络带宽?服务器端计算涉及?涉及客户端计算?
沿着同样的路线,数据是什么?
例如,如果数据是整数并且网络带宽很重要,您可以从树构造一个int数组,以最小的开销传输它,然后将其转换回用户端的二叉树。 / p>
如果服务器端负载是最重要的,那么你将采用不同的路线。如果客户端加载,可能还有另一个。
值得注意的是,由于这是一个面试问题,与面试官讨论他们认为对效率有何重要性及其对解决方案的影响可能与您提出的实际解决方案同样重要。
答案 1 :(得分:0)
对我而言,问题似乎与传输本身无关,而是人们如何打包要传输的数据。需要注意的重要一点是,由于传输字节而不是C ++对象,因此在传输过程中无法轻松保留树的结构。
因此,我建议您serialize树,然后通过网络发送。您显然需要客户端知道的预定序列化方案,以便客户端可以从它接收的字节重新创建树。
答案 2 :(得分:0)
足以说明如何将给定的二叉树T转换为值的序列S,使得我们可以在客户端从S重构T。一种可能的方法是使用众所周知的事实:
我们可以从它的inorder和preorder中唯一地构造一个二叉树 遍历。
因此我们可以让S成为顺序遍历,然后是前序遍历。检查此question的答案。