- /*
- 编写算法函数void preorder1(bintree t)实现二叉树t的非递归前序遍历。
- */
- #include "bintree.h"
- char *a="ABC##D#E##F##"; /*扩充二叉树序树t的前序序列*/
- /*函数preorder1()的功能是非递归前序遍历二叉树t,请将函数补充完整并调试运行*/
- void preorder1(bintree t)
- {
- seqstack s;//顺序栈s
- s.top=0;
- while((t) || (s.top!=0)) //当前处理的子树不为空或栈不为空则循环
- {
- if(t)
- {
- printf("%c ",t->data);
- push(&s,t);
- t=t->lchild;
- }
- else
- {
- t=pop(&s);
- t=t->rchild;
- }
- }
- }
- int main()
- { bintree t;
- t=creatbintree(); /*建立二叉树t的存储结构*/
- printf("二叉树的前序序列为:\n");
- preorder1(t); /*前序非递归遍历二叉树*/
- return 0;
- }
- /*
- 编写算法函数void levelbintree(bintree t),实现二叉树的层次遍历。
- */
- #include "bintree.h"
- char *a="ABC##D#E##F##"; /*扩充二叉树序树t的前序序列*/
- void levelbintree(bintree t)
- {
- bintree queue[100];
- int f=0,r=1;
- bintree p;
- queue[0]=t;
- while(f<r)
- {
- p=queue[f]; f++; printf("%c",p->data);
- if(p->lchild)
- queue[r++]=p->lchild;
- if(p->rchild)
- queue[r++]=p->rchild;
- }
- }
- int main()
- { bintree t;
- t=creatbintree(); /*建立二叉树t的存储结构*/
- printf("二叉树的层次序列为:\n");
- levelbintree(t); /*层次遍历二叉树*/
- return 0;
- }
- /*
- 编写函数bintree prelist(bintree t),bintree postfirst(bintree t),
- 分别返回二叉树t在前序遍历下的最后一个结点地址和后序遍历下的第一个结点地址。
- */
- #include "bintree.h"
- char *a="ABC##D##EF#G###"; /*扩充二叉树序树t的前序序列*/
- bintree prelast(bintree t)
- { //右下叶子结点
- bintree p;
- if(t)
- {
- p=t;
- while(p&&p->lchild||p->rchild)
- {
- if(p->rchild)
- {
- p=p->rchild;
- }
- else
- {
- p=p->lchild;
- }
- }
- }
- return p; //返回前序序列最后一个结点G
- }
- bintree postfirst(bintree t)
- { //后序遍历是左子树-右子树-根结点 ,二叉树的左下叶子结点是第一个
- bintree p;
- if(t)
- {
- while(p&&p->lchild||p->rchild)
- {
- if(p->lchild)
- {
- p=p->lchild;
- }
- else
- {
- p=p->rchild;
- }
- }
- }
- return p;//返回后序序列第一个结点 C
- }
- int main()
- { bintree t,p,q;
- t=creatbintree(); /*建立二叉树t的存储结构*/
- p=prelast(t);
- //q=postfirst(t);
- if (t!=NULL)
- { printf("前序遍历最后一个结点为:%c\n",p->data);
- // printf("后序遍历第一个结点为:%c\n",q->data);
- }
- else printf("二叉树为空!");
- return 0;
- }
- /*
- 假设二叉树采用链式方式存储,t为其根结点,编写一个函数int Depth(bintree t, char x),求值为x的结点在二叉树中的层次。
- */
- #include "bintree.h"
- char *a="ABC##D##EF#G###"; /*扩充二叉树序树t的前序序列*/
- /*
- 函数Depth,功能:求结点x所在的层次
- */
- int Depth(bintree t,char x)
- {
- int num1,num2,n;//num1,num2分别记录在左子树,右子树中查找到x的层数,n记录最终返回的结果层数
- if(t==NULL)
- {
- return 0;
- }
- else
- {
- if(t->data==x)
- {
- return 1;
- }
- num1=Depth(t->lchild,x);
- num2=Depth(t->rchild,x);
- n=num1+num2; //num1和num2之中必有一个为0
- if(num1!=0||num2!=0) //找到了x ,往回数
- {
- n++;
- }
- }
- return n;
- }
- int main()
- { bintree root;
- char x;
- int k=0;
- root=creatbintree();
- printf("请输入树中的1个结点值:\n");
- scanf("%c",&x);
- k=Depth(root,x);
- printf("%c结点的层次为%d\n",x,k);
- }
- /*
- 试编写一个函数,将一棵给定二叉树中所有结点的左、右子女互换。
- */
- #include "bintree.h"
- char *a="ABC##D##EF#G###"; /*扩充二叉树序树t的前序序列*/
- /*请将本函数补充完整,并进行测试*/
- void change(bintree t)
- {
- bintree p;
- if(t)
- {
- p=t->lchild; //交换
- t->lchild=t->rchild;
- t->rchild=p;
- change(t->lchild); //继续递归
- change(t->rchild);
- }
- }
- int main()
- { bintree root;
- root=creatbintree();
- change(root);
- preorder(root);
- }
- /*
- 试编写一个递归函数bintree buildBintree(char *pre, char *mid, int length),
- 根据二叉树的前序序列pre、中序序列mid和前序序列长度length,构造二叉树的二叉链表存储结构,
- 函数返回二叉树的树根地址。
- */
- #include "bintree.h"
- #include <string.h>
- char *a="";
- /*请将本函数补充完整,并进行测试*/
- bintree buildBintree(char *pre, char *mid,int length)
- {
- bintree t;
- int i=0;
- if(length)
- {
- t=(bintree)malloc(sizeof(binnode)); //生成新结点
- t->data=pre[i];
- while(i<length&&mid[i]!=pre[0]) //在中序遍历中查找根结点的位置
- i++;
- t->lchild=buildBintree(pre+1,mid,i);
- t->rchild=buildBintree(pre+i+1,mid+i+1,length-i-1);
- }
- else
- return NULL;
- return t;
- }
- int main()
- { bintree root;
- char pre[100],mid[100];
- puts("请输入前序序列:");
- gets(pre);
- puts("请输入中序序列:");
- gets(mid);
- root=buildBintree(pre,mid,strlen(pre));
- puts("后序序列是:");
- postorder(root);
- }
头文件这里就不贴出来了
本文地址:http://liuyanzhao.com/3411.html
转载请注明
您可以选择一种方式赞助本站
支付宝扫一扫赞助
微信钱包扫描赞助
赏