对二叉树的一系列操作都是建立在先将二叉树构造出来的前提上。大四考研的某天早上偷偷躲在宿舍敲二叉树的代码,也是醉醉的。学习就应该趁年轻,老了就学不动了。
首先是对二叉树的节点的一个声明:
typedef struct BTree{ char str; struct BTree * lchild; struct BTree * rchild; }BTree;
然后我是打算用递归外加先序的方式对二叉树进行构建的,也就对输入字符串提出一个要求:
printf("Please input the tree(use char and #)\n要求按照先序遍历的方式输入,加上#进行区分\n例如123# #4##5##:\n");
构建二叉树的函数:
BTree* creat_tree(){ BTree* temp; while(*p==‘ ‘)p++; if(*p==‘#‘){ p++; return NULL; } if(*p!=‘ ‘){ temp = (BTree *)malloc(sizeof(BTree)); temp->str=*p++; temp->lchild=creat_tree(); temp->rchild=creat_tree(); } return temp; }
同时为了将头结点单独获取保存,供后边操作使用,因此将头结点的构建单独放在main函数中处理了一下,下边是我的完整代码,运行无误。
#include <stdio.h> #include <stdlib.h> #define MAX 100 char * p; typedef struct BTree{ char str; struct BTree * lchild; struct BTree * rchild; }BTree; BTree* creat_tree(){ BTree* temp; while(*p==‘ ‘)p++; if(*p==‘#‘){ p++; return NULL; } if(*p!=‘ ‘){ temp = (BTree *)malloc(sizeof(BTree)); temp->str=*p++; temp->lchild=creat_tree(); temp->rchild=creat_tree(); } return temp; } void pre_visit(BTree* node){ printf("%c",node->str); if(node->lchild!=NULL)pre_visit(node->lchild); if(node->rchild!=NULL)pre_visit(node->rchild); } int main() { char tree[MAX];p=tree; BTree * head; printf("Please input the tree(use char and #)\n要求按照先序遍历的方式输入,加上#进行区分\n例如123# #4##5##:\n"); //scanf("%s",tree); gets(tree); if(*p!=‘\0‘&&*p!=‘ ‘&&*p!=‘#‘){ head=(BTree *)malloc(sizeof(BTree)); head->str=*p++; //printf("head is %c",head->str); head->lchild=creat_tree(); head->rchild=creat_tree(); } printf("tree is :\n"); pre_visit(head); return 0; }
时间: 2024-10-16 07:02:46