二叉树一点操作

#include <stdio.h>
#include <stdlib.h>
typedef struct Tree{
int data;
struct Tree *lchild,*rchild;
}Tree,*BiTree;

BiTree CreateLink(){
int data;
int temp;
BiTree T;
scanf("%d",&data);
temp = getchar();
if(data == -1)
return NULL;
else{
T = (BiTree)malloc(sizeof(Tree));
T->data = data;
printf("请输入%d的左子树\n",data);
T->lchild = CreateLink();
printf("请输入%d的右子树\n",data);
T->rchild = CreateLink();
return T;
}
}
void firstbl(BiTree T){
if(T == NULL){
return;
}
printf("%d ",T->data);
firstbl(T->lchild);
firstbl(T->rchild);
}
void betweenbl(BiTree T){
if(T == NULL){
return;
}
betweenbl(T->lchild);
printf("%d ", T->data);
betweenbl(T->rchild);
}
void lastbl(BiTree T){
if(T == NULL){
return;
}
lastbl(T->lchild);
lastbl(T->rchild);
printf("%d ", T->data);
}
int depth(BiTree T) {
if (T == NULL) {
return 0;
}
int ldepth = depth(T->lchild);
int rdepth = depth(T->rchild);
return (ldepth > rdepth) ? (ldepth + 1) : (rdepth + 1);
}
int countNode(BiTree T) {
if (T == NULL) {
return 0;
} else {
return 1 + countNode(T->lchild) + countNode(T->rchild);
}
}
int countLeafNode(BiTree T) {
if (T == NULL) {
return 0;
}
else if (T->lchild == NULL && T->rchild == NULL) {
return 1;
}
else {
return countLeafNode(T->lchild) + countLeafNode(T->rchild);
}
}
int countD(BiTree T) {
if (T == NULL) {
return 0;
}
else if ((T->lchild == NULL && T->rchild != NULL) || (T->lchild != NULL && T->rchild == NULL)) {
return 1 + countD(T->lchild) + countD(T->rchild);
}
else {
return countD(T->lchild) + countD(T->rchild);
}
}
void road(BiTree T, int x){
static int flag = 0;
if(T == NULL){
return;
}
if(T->data == x){
printf("%d", T->data);
flag = 1;
return;
}
if(flag == 0){
road(T->lchild, x);
}
if(flag == 0){
road(T->rchild, x);
}
if(flag == 1){
printf(" -> %d", T->data);
}
}
int main()
{
BiTree S;
printf("请输入第一个节点的数据:\n");
S = CreateLink();
printf("先序遍历的结果为:\n");
firstbl(S);
printf("\n");
printf("中序遍历的结果为:\n");
betweenbl(S);
printf("\n");
printf("后序遍历的结果为:\n");
lastbl(S);
printf("\n");
depth(S);
printf("此二叉树的深度为:%d\n",depth(S));
countNode(S);
printf("此二叉树的结点个数为:%d\n",countNode(S));
printf("此二叉树的叶结点个数为:%d\n",countLeafNode(S));
printf("此二叉树中度为1的结点个数为:%d\n",countD(S));
int x;
printf("请输入要查找的叶节点值:");
scanf("%d", &x);
printf("%d到根结点的路径为:", x);
road(S, x);
printf("\n");
return 0;
}

 

 

 

          

posted @ 2023-04-03 10:56  真绪无码  阅读(23)  评论(0)    收藏  举报