Beispiel #1
0
int main(int argc, char **argv)
{
	CSTree T;
	TElemType e;
	TElemType e1;
	InitTree(&T);
	printf("构造空树后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%d\n",\
			TreeEmpty(T), Root(T), TreeDepth(T));
	CreateTree(&T);
	printf("构造空树后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%d\n",\
				TreeEmpty(T), Root(T), TreeDepth(T));
	printf("先根遍历树T:\n");
	PreOrderTraverse(T, vi);
	printf("\n请输入等修改的结点的值 新值:");
	scanf("%c%*c%c%*c", &e, &e1);
	Assign(&T, e, e1);
	printf("后根遍历修改后的树T:\n");
	PostOrderTraverse_recurssion1(T, vi);
	printf("\n");
	printf("PostOrderTraverse_recurssion1 complete!\n");
	PostOrderTraverse_recurssion2(T, vi);
	printf("\n");
	printf("PostOrderTraverse_recurssion2 complete!\n");
	printf("\n%c的双亲是%c, 长子是%c,下一个兄弟是%c\n", e1, Parent(T, e1),\
			LeftChild(T, e1), RightSibling(T, e1));
	printf("层序遍历树:\n");
	LevelOrderTraverse(T, vi);
	DestroyTree(&T);
	return EXIT_SUCCESS;
}
Beispiel #2
0
 void main()
 {
   int i;
   PTree T,p;
   TElemType e,e1;
   InitTree(T);
   printf("构造空树后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%d\n",TreeEmpty(T),Root(T),TreeDepth(T));
   CreateTree(T);
   printf("构造树T后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%d\n",TreeEmpty(T),Root(T),TreeDepth(T));
   printf("层序遍历树T:\n");
   TraverseTree(T,vi);
   printf("请输入待修改的结点的值 新值: ");
   scanf("%c%*c%c%*c",&e,&e1);
   Assign(T,e,e1);
   printf("层序遍历修改后的树T:\n");
   TraverseTree(T,vi);
   printf("%c的双亲是%c,长子是%c,下一个兄弟是%c\n",e1,Parent(T,e1),LeftChild(T,e1),RightSibling(T,e1));
   printf("建立树p:\n");
   InitTree(p);
   CreateTree(p);
   printf("层序遍历树p:\n");
   TraverseTree(p,vi);
   printf("将树p插到树T中,请输入T中p的双亲结点 子树序号: ");
   scanf("%c%d%*c",&e,&i);
   InsertChild(T,e,i,p);
   Print(T);
   printf("删除树T中结点e的第i棵子树,请输入e i: ");
   scanf("%c%d",&e,&i);
   DeleteChild(T,e,i);
   Print(T);
 }
Beispiel #3
0
 Status InsertChild(PTree *T,TElemType p,int i,PTree c)
 { /* 初始条件: 树T存在,p是T中某个结点,1≤i≤p所指结点的度+1,非空树c与T不相交 */
   /* 操作结果: 插入c为T中p结点的第i棵子树 */
   int j,k,l,f=1,n=0; /* 设交换标志f的初值为1,p的孩子数n的初值为0 */
   PTNode t;
   if(!TreeEmpty(*T)) /* T不空 */
   {
     for(j=0;j<(*T).n;j++) /* 在T中找p的序号 */
       if((*T).nodes[j].data==p) /* p的序号为j */
         break;
     l=j+1; /* 如果c是p的第1棵子树,则插在j+1处 */
     if(i>1) /* c不是p的第1棵子树 */
     {
       for(k=j+1;k<(*T).n;k++) /* 从j+1开始找p的前i-1个孩子 */
         if((*T).nodes[k].parent==j) /* 当前结点是p的孩子 */
         {
           n++; /* 孩子数加1 */
           if(n==i-1) /* 找到p的第i-1个孩子,其序号为k1 */
             break;
         }
       l=k+1; /* c插在k+1处 */
     } /* p的序号为j,c插在l处 */
     if(l<(*T).n) /* 插入点l不在最后 */
       for(k=(*T).n-1;k>=l;k--) /* 依次将序号l以后的结点向后移c.n个位置 */
       {
         (*T).nodes[k+c.n]=(*T).nodes[k];
         if((*T).nodes[k].parent>=l)
           (*T).nodes[k+c.n].parent+=c.n;
       }
     for(k=0;k<c.n;k++)
     {
       (*T).nodes[l+k].data=c.nodes[k].data; /* 依次将树c的所有结点插于此处 */
       (*T).nodes[l+k].parent=c.nodes[k].parent+l;
     }
     (*T).nodes[l].parent=j; /* 树c的根结点的双亲为p */
     (*T).n+=c.n; /* 树T的结点数加c.n个 */
     while(f)
     { /* 从插入点之后,将结点仍按层序排列 */
       f=0; /* 交换标志置0 */
       for(j=l;j<(*T).n-1;j++)
         if((*T).nodes[j].parent>(*T).nodes[j+1].parent)
         {/* 如果结点j的双亲排在结点j+1的双亲之后(树没有按层序排列),交换两结点*/
           t=(*T).nodes[j];
           (*T).nodes[j]=(*T).nodes[j+1];
           (*T).nodes[j+1]=t;
           f=1; /* 交换标志置1 */
           for(k=j;k<(*T).n;k++) /* 改变双亲序号 */
             if((*T).nodes[k].parent==j)
               (*T).nodes[k].parent++; /* 双亲序号改为j+1 */
             else if((*T).nodes[k].parent==j+1)
               (*T).nodes[k].parent--; /* 双亲序号改为j */
         }
     }
     return OK;
   }
   else /* 树T不存在 */
     return ERROR;
 }
void main()
{
	int i;
	CSTree T, p, q;
	TElemType e, e1;

	InitTree(T);
	printf("构造空树后,树空否?%d(1:是 0:否)。树根为%c,树的深度为%d。\n",
	       TreeEmpty(T), Root(T), TreeDepth(T));
	CreateTree(T);
	printf("构造树T后,树空否?%d(1:是 0:否)。树根为%c,树的深度为%d。\n",
	       TreeEmpty(T), Root(T), TreeDepth(T));
	printf("层序遍历树T:\n");
	LevelOrderTraverse(T, visit);
	printf("请输入待修改的结点的值 新值:");
	scanf("%c%*c%c%*c", &e, &e1);
	Assign(T, e, e1);
	printf("层序遍历修改后的树T:\n");
	LevelOrderTraverse(T, visit);
	printf("%c的双亲是%c,长子是%c,下一个兄弟是%c。\n", e1, Parent(T, e1),
	       LeftChild(T, e1), RightSibling(T, e1));
	printf("建立树p:\n");
	CreateTree(p);
	printf("层序遍历树p:\n");
	LevelOrderTraverse(p, visit);
	printf("将树p插到树T中,请输入T中p的双亲结点 子树序号:");
	scanf("%c%d%*c", &e, &i);
	q = Point(T, e);
	InsertChild(T, q, i, p);
	printf("层序遍历修改后的树T:\n");
	LevelOrderTraverse(T, visit);
	printf("先根遍历树T:\n");
	PreOrderTraverse(T, visit);
	printf("\n后根遍历树T:\n");
	PostOrderTraverse(T, visit);
	printf("\n删除树T中结点e的第i棵子树,请输入e i:");
	scanf("%c%d", &e, &i);
	q = Point(T, e);
	DeleteChild(T, q, i);
	printf("层序遍历修改后的树T:\n");
	LevelOrderTraverse(T, visit);
	DestroyTree(T);
}
 void main()
 {
   int i;
   CSTree T,p,q;
   TElemType e,e1;
   InitTree(&T);
   printf("构造空树后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%d\n",TreeEmpty(T),Root(T),TreeDepth(T));
   CreateTree(&T);
   printf("构造树T后,树空否? %d(1:是 0:否) 树根为%c 树的深度为%d\n",TreeEmpty(T),Root(T),TreeDepth(T));
   printf("先根遍历树T:\n");
   PreOrderTraverse(T,vi);
   printf("\n请输入待修改的结点的值 新值: ");
   scanf("%c%*c%c%*c",&e,&e1);
   Assign(&T,e,e1);
   printf("后根遍历修改后的树T:\n");
   PostOrderTraverse(T,vi);
   printf("\n%c的双亲是%c,长子是%c,下一个兄弟是%c\n",e1,Parent(T,e1),LeftChild(T,e1),RightSibling(T,e1));
   printf("建立树p:\n");
   InitTree(&p);
   CreateTree(&p);
   printf("层序遍历树p:\n");
   LevelOrderTraverse(p,vi);
   printf("\n将树p插到树T中,请输入T中p的双亲结点 子树序号: ");
   scanf("%c%d%*c",&e,&i);
   q=Point(T,e);
   InsertChild(&T,q,i,p);
   printf("层序遍历树T:\n");
   LevelOrderTraverse(T,vi);
   printf("\n删除树T中结点e的第i棵子树,请输入e i: ");
   scanf("%c%d",&e,&i);
   q=Point(T,e);
   DeleteChild(&T,q,i);
   printf("层序遍历树T:\n",e,i);
   LevelOrderTraverse(T,vi);
   printf("\n");
   DestroyTree(&T);
 }
Beispiel #6
0
int main(int argc,char *argv[])
{
	int i;
	TElemType e,tempe;
	PTree T,C;

	InitTree(T);
	InitTree(C);

	printf("������:");
	CreateTree(T);
	CreateTree(C);
	printf("\n������:");
	TraverseTree(T,Visit);
	printf("\n");
	TraverseTree(C,Visit);

	printf("\n����:%c",Root(T));
	printf("\n����i:");
	scanf("%d%*c",&i);
	printf("\n��ֵ:%c",(tempe=Value(T,i)));
	printf("\n��ֵ:");
	scanf("%c%*c",&e);
	Assign(T,tempe,e);
	printf("\n���ڵ㡢���ӡ����ֵܣ��������:%c %c %c %d %d",
		
		Value(T,Parent(T,e)),
		Value(T,LeftChild(T,e)),Value(T,RightSibling(T,e)),
		TreeDepth(T),TreeEmpty(T));
	printf("\n��������:");
	InsertChild(T,e,1,C);
	TraverseTree(T,Visit);
	printf("\nɾ�������:");
	DeleteChild(T,e,1);
	TraverseTree(T,Visit);

	DestroyTree(T);
	DestroyTree(C);
	return 0;
}