6.4.2 二叉树其它操作算法举例

 三、复制二叉树

  以后序遍历为例可得下列算法。先写一个生成一个二叉树的结点的算法:
算法
  BiTNode *GetTreeNode(TElemType item,BiTNode *lptr, BiTNode *rptr)
 {
  // 生成一个其元素值为 item,左指针为 lptr,右指针为 rptr 的结点
  T = new BiTNode; T-> data = item;
  T-> Lchild = lptr; T-> Rchild = rptr;
  return T;
 }
 
   
 
 
 
  复制二叉树指的是,在计算机中已经存在一棵二叉树,现要按原二叉树的结构重新生成一棵二叉树,其实质就是就是按照原二叉树的二叉链表另建立一个新的二叉链表。类似于求二叉树的深度,"复制"可以在先序遍历过程中进行,也可以在后序遍历过程中进行。但不管是哪一种遍历,其"访问"操作都是"生成二叉树的一个结点"。
 
    后序遍历复制二叉树的操作即为,先分别复制已知二叉树的左、右子树,然后生成一个新的根结点,则复制得到的两棵子树的根指针应是这个新生成的结点的左、右指针域的值,如动画所示。动画

算法 算法 6.5
  BiTNode *CopyTree(BiTNode *T)
 {
  // 已知二叉树的根指针为 T,本算法返回它的复制品的根指针
  if (!T )
   return NULL;              // 复制一棵空树
  if (T->Lchild)
   newlptr = CopyTree(T->Lchild);      // 复制(遍历)左子树
  else newlptr = NULL;
  if (T->Rchild)
   newrptr = CopyTree(T->Rchild);      // 复制(遍历)右子树
  else newrptr = NULL;
  newnode = GetTreeNode(T->data, newlptr, newrptr);// 生成根结点
  return newnode;
 }
 




  例如对下列二叉树,算法6.5的执行过程如动画所示。动画