📄
字号:
二叉树的操作
基本要求:
1、用二叉链表作为存储结构,建立一棵二叉树。
2、分别按先序、中序和后序遍历二叉树,输出各遍历序列。
3、编写交换二叉树中所有结点左右孩子的非递归算法。
我的程序是:
#include<stdlib.h>
#include<math.h>
#define NULL 0
#define maxsize 100
#define LEN sizeof(struct student)
typedef struct student
{struct student *lchild,*rchild;
char data;
}*STU;
STU stree_creat(char *s,int k)
{STU p;
if(s[k]=='\0'||k>maxsize)
return NULL;
else
{p=(STU)malloc(LEN);
p->data=s[k];
p->lchild=stree_creat(s,2*k+1);
p->rchild=stree_creat(s,2*k+2);
return p;
}
}
void print(STU p)
{ STU h[maxsize]={NULL};
int top=0,base=0;
h[top]=p;
printf("The chengci order:\n\n");
while(h[base]!=NULL)
{
printf("[%c]",h[base]->data);
h[++top]=h[base]->lchild;
h[++top]=h[base]->rchild;
base++;
}
printf("\nSuccess......\n\n!!!");
}
/*前序遍历*/
void Preorder(STU p)
{if(p)
{
printf("[%c]",p->data);
Preorder(p->lchild);
Preorder(p->rchild);
}
}
/*中序遍历*/
void Inorder(STU p)
{if(p)
{
Inorder(p->lchild);
printf("[%c]",p->data);
Inorder(p->rchild);
}
}
/*后序遍历*/
void Postorder(STU p)
{if(p)
{
Postorder(p->lchild);
Postorder(p->rchild);
printf("[%c]",p->data);
}
}
/*交换该二叉树中所有结点左右孩子的非递归算法*/
void conver(char a[],int m)
{int i,j,h=1,k=2;
char t;
for(i=1;i<=(int)(log(m+1)+1);i++)
{for(j=0;j<pow(2,i-1);j++)
{t=a[h+j];a[h+j]=a[k-j];a[k-j]=t;}
h=2*h+1;
k=2*k+2;
}
}
main()
{STU root=NULL;
int i=0,j=0,h=0;
char a[maxsize]={'\0'};
clrscr();
/*用一个数组存放一连串的字符串*/
gets(a);
while(a!='\0')
i++;
/*建立二叉树*/
root=stree_creat(a,0);
printf("\n");
/*输出数组中的内容*/
print(root);
/*前序遍历*/
printf("Preorder Traversal........\n");
Preorder(root);
printf("\n");
/*中序遍历*/
printf("\nInorder Traversal........\n");
Inorder(root);
printf("\n");
/*后序遍历*/
printf("\nPostorder Traversal........\n");
Postorder(root);
/*交换该二叉树中所有结点左右孩子的非递归算法*/
conver(a,i);
/*层次顺序输出数据*/
printf("\n\nThe conver order........\n");
while(j<i)
{if(a[h]!='\0')
{printf("[%c]",a[h]);
j++;}
else
printf("[ ]");
h++;}/*中间的空格不要打印出来*/
printf("\n");
getch();
}
当我在Win-TC上运行后,不知到该怎样输入数据来创建二叉树。我试过直接输入“123456”它的层次遍历是123456,先序是124536、中序是425163和后序是452631。这么说它要是这样输入(1234546)的的话,它默认了按层次且首先排满左子树,就是说尽可能保持左子树为满二叉树。但是现在对于含几点“123456”这种情况,要是我要实现层次遍历是1234546,先序是124356,中序425361,后序是425631。简单的说,我要把结点2的右孩子结点设计为空,该怎样输入。
总之就是运行那个程序时,用什么输入符号来代替某个结点为空????
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -