Binary tree 复制二叉树

Binary tree 复制二叉树,binary-tree,Binary Tree,当被要求创建二叉树的副本时,我总是被告知使用后序遍历逻辑来创建副本 是否不可能预先处理原始树或创建副本 有哪种遍历方法比另一种更优化 邮购方式: NODEPTR Copy(NODEPTR p) { if (p == null) return p NODEPTR left = Copy(p-> left) NODEPTR right = Copy(p-> right) NODEPTR root = MakeBT(p->data, left, right) //Ma

当被要求创建二叉树的副本时,我总是被告知使用后序遍历逻辑来创建副本

是否不可能预先处理原始树或创建副本

有哪种遍历方法比另一种更优化

邮购方式:

NODEPTR Copy(NODEPTR p)
{
  if (p == null) return p
  NODEPTR left = Copy(p-> left)
  NODEPTR right = Copy(p-> right)
  NODEPTR root = MakeBT(p->data, left, right) //MakeBT is a helper function that makes a tree
  return (root)
}
NODEPTR Copy(NODEPTR p)
{
  if (p == null) return p
  NODEPTR root
  root->data = p->data
  root-> left = Copy(p-> left)
  root-> right = Copy(p-> right)      
  return (root)
}
   NODEPTR Copy(NODEPTR p)
    {
      if (p == null) return p
      NODEPTR left = Copy(p-> left)
      NODEPTR root
      root-> data = p-> data
      root-> left = left
      root-> right = Copy(p-> right) 
      return (root)
    }
预购方式:

NODEPTR Copy(NODEPTR p)
{
  if (p == null) return p
  NODEPTR left = Copy(p-> left)
  NODEPTR right = Copy(p-> right)
  NODEPTR root = MakeBT(p->data, left, right) //MakeBT is a helper function that makes a tree
  return (root)
}
NODEPTR Copy(NODEPTR p)
{
  if (p == null) return p
  NODEPTR root
  root->data = p->data
  root-> left = Copy(p-> left)
  root-> right = Copy(p-> right)      
  return (root)
}
   NODEPTR Copy(NODEPTR p)
    {
      if (p == null) return p
      NODEPTR left = Copy(p-> left)
      NODEPTR root
      root-> data = p-> data
      root-> left = left
      root-> right = Copy(p-> right) 
      return (root)
    }
按顺序:

NODEPTR Copy(NODEPTR p)
{
  if (p == null) return p
  NODEPTR left = Copy(p-> left)
  NODEPTR right = Copy(p-> right)
  NODEPTR root = MakeBT(p->data, left, right) //MakeBT is a helper function that makes a tree
  return (root)
}
NODEPTR Copy(NODEPTR p)
{
  if (p == null) return p
  NODEPTR root
  root->data = p->data
  root-> left = Copy(p-> left)
  root-> right = Copy(p-> right)      
  return (root)
}
   NODEPTR Copy(NODEPTR p)
    {
      if (p == null) return p
      NODEPTR left = Copy(p-> left)
      NODEPTR root
      root-> data = p-> data
      root-> left = left
      root-> right = Copy(p-> right) 
      return (root)
    }

下面是一个cpp程序,用于将二叉树(节点)复制到新的二叉树(NewNode)

#包括
使用名称空间std;
类节点{
公众:
int-val;
Node*left=NULL;
Node*right=NULL;
节点(int-val){
这->val=val;
此->右=空;
此->左=空;
}
空白插入(int v){
如果(此->左==NULL)
此->左=新节点(v);
else if(this->right==NULL)
此->右=新节点(v);
其他的
coutright->print();
}
};
类NewNode{
公众:
int-val;
NewNode*left=NULL;
NewNode*right=NULL;
NewNode*parent=NULL;
作废打印(){
coutprint();
如果(this->right)this->right->print();
}
};
无效副本(节点*原件,新节点*副本){
复制->增值=原始->增值;
//coutleft=newLeft;
//printf(“在左侧复制%d%d%d\n”,复制->val,复制->左侧,复制->父级);
复制(原件->左,副本->左);
}
如果(原始->右侧){
NewNode*newRight=newnewnode;
newRight->parent=重复;
复制->右侧=新建右侧;
//printf(“在右侧复制%d%d%d\n”,复制->值,复制->右侧,复制->父级);
复制(原件->右侧,副本->右侧);
}
}
int main(){
节点根(1);
根。插入(2);
根。插入(3);
printf(“%d%d%d\n”,root.val,root.left,root.right);
Node*temp=root.left;
临时->插入(4);
临时->插入(5);
printf(“%d%d%d\n”,临时->值,临时->左,临时->右);
新节点root2;
复制(&root,&root2);
printf(“%d%d%d\n”,root2.val,root2.left,root2.right);
NewNode*temp1=root2.left;
printf(“%d%d%d\n”,temp1->val,temp1->left,temp1->right);
root.print();

你能试着用三种方式写吗?用我的尝试编辑了问题看,你已经通过尝试回答了你自己问题的一部分。所以继续尝试。好的,也尝试了按顺序写的方式。你们能确认正确性吗?