一、前序遍历创建二叉树,使用递归,头文件 BiTree.h
/*槽点一:创建树时用scanf输入不成功*/ #ifndef BITREE_H #define BITREE_H #include<stdio.h> #include<stdlib.h> typedef char ElementType; typedef struct treenode { ElementType data; struct treenode *leftchild; struct treenode *rightchild; } TreeNode; /*使用先序遍历创建二叉树*/ TreeNode *create_bitree() { ElementType ch; TreeNode *T; scanf("%c",&ch); //这样调用scanf时,树的结点一次全部输入,如果要一次一个的输入,在%c前加个空格 if(ch!='#') { T=(TreeNode*)malloc(sizeof(TreeNode)); T->data=ch; T->leftchild=create_bitree(); T->rightchild=create_bitree(); } else { T=NULL; } return T; } /*先序遍历*/ void pre_order_traversal(TreeNode *T) { ElementType data; if(T!=NULL) { data=T->data; printf("%c ",data); pre_order_traversal(T->leftchild); pre_order_traversal(T->rightchild); } } #endif
有两个地方需要注意:1、要将树的节点指针作为返回值返回,而不能向下面这样直接作为参数传入,因为作为参数传递时只是传递了T 的一个copy,后来调用malloc函数分配新的内存地址时,也是赋给了这个备份,也就是说最后T依然没有改变,碰到malloc和指针做参数都要注意这个问题;2、scanf函数的问题:scanf会读入回车符,当需要一个一个的输入字符时,可以在%c前面加个空格
int create_bitree(TreeNode *T;) { ElementType ch; scanf("%c",&ch); //这样调用scanf时,树的结点一次全部输入,如果要一次一个的输入,在%c前加个空格 if(ch!='#') { T=(TreeNode*)malloc(sizeof(TreeNode)); T->data=ch; create_bitree(T->leftchild); create_bitree(T->rightchild); } else { T=NULL; } return 1; }