代码如下:
#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct tnode {
datatype data;
struct tnode *lchild, *rchild;
} BiTNode, *BiTree;
void visit(BiTree p); /*输出p指针指向的结点*/
void Preorder(BiTree T); /*前序遍历*/
void Inorder(BiTree T); /*中序遍历*/
void Postorder(BiTree T); /*后序遍历*/
BiTree CreateTree(); /*以前序遍历的顺序建立二叉树*/
int deep(BiTree T); /*求二叉树深度*/
int leaf(BiTree T); /*求叶子结点数*/
int OneChild(BiTree T); /*求1度结点数*/
int TwoChild(BiTree T); /*求2度结点数*/
void Exchange(BiTree T); /*二叉树左右子树交换*/
BiTree InorderLastNode(BiTree T); /*找二叉树中序遍历最后一个结点*/
void visit(BiTree p) { /*输出p指针指向的结点*/
if (p->data != " ") {
printf("%c ", p->data);
}
}
void Preorder(BiTree T) { /*前序遍历*/
if (T != NULL) {
visit(T); //访问根节点
Preorder(T->lchild); //访问左子节点
Preorder(T->rchild); //访问右子节点
}
}
void Inorder(BiTree T) { /*中序遍历*/
if (T != NULL) {
Inorder(T->lchild); //访问左子节点
visit(T); //访问根节点
Inorder(T->rchild); //访问右子节点
}
}
void Postorder(BiTree T) { /*后序遍历*/
if (T != NULL) {
Postorder(T->lchild); //访问左子节点
Postorder(T->rchild); //访问右子节点
visit(T); //访问根节点
}
}
BiTree CreateTree() { /*以前序遍历的顺序建立二叉树*/
char ch;
BiTree T;
if ((ch = getchar()) == " ") {
return NULL;
}
else {
T = (BiTree)malloc(sizeof(BiTNode)); //生成根节点
T->data = ch;
T->lchild = CreateTree(); //构造左子树
T->rchild = CreateTree(); //构造右子树
return T;
}
}
int deep(BiTree T) { /*求二叉树深度*/
if (T) {
int leftdeep = deep(T->lchild);
int rightdeep = deep(T->rchild);
return leftdeep >= rightdeep ? leftdeep + 1 : rightdeep + 1;
}
else {
return 0;
}
}
int leaf(BiTree T) { /*求叶子结点数*/
int m, n;
if (!T) { /*空树没有叶子*/
return 0;
}
else if(!T->lchild&&!T->rchild){ /*叶子结点*/
return 1;
}
else { /*左子树的结点数加上右子树的结点数*/
m = leaf(T->lchild);
n = leaf(T->rchild);
return m + n;
}
}
int OneChild(BiTree T) { /*求1度结点数*/
int n = 0;
if (T == NULL) {
return 0;
}
else if ((T->lchild == NULL&&T->rchild != NULL) || (T->lchild != NULL&&T->rchild == NULL)) {
n = 1;
}
return OneChild(T->lchild) + OneChild(T->rchild) + n;
}
int TwoChild(BiTree T) { /*求2度结点数*/
int n = 0;
if (T == NULL) {
return 0;
}
else if ((T->lchild!=NULL&&T->rchild!=NULL))
{
n = 1;
}
return TwoChild(T->lchild) + TwoChild(T->rchild) + n;
}
void Exchange(BiTree T) { /*二叉树左右子树交换*/
if (T) {
BiTree temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
Exchange(T->lchild);
Exchange(T->rchild);
}
}
BiTree InorderLastNode(BiTree T) { /*找二叉树中序遍历最后一个结点*/
datatype s;
if (T) {
InorderLastNode(T->lchild);
s = T->data;
InorderLastNode(T->rchild);
}
return s;
}
int main() {
BiTree T;
T = CreateTree();
printf("\n以前序遍历的二叉树:");
printf("\n先序遍历:");
Preorder(T);
printf("\n");
printf("\n中序遍历:");
Inorder(T);
printf("\n");
printf("\n后序遍历:");
Postorder(T);
printf("\n");
printf("\n树的深度=%d\n", deep(T));
printf("1度结点数=%d\n", OneChild(T));
printf("2度结点数=%d\n", TwoChild(T));
Exchange(T);
printf("\n");
InorderLastNode(T);
return 0;
}
报错:
1>d:\visual studio 2015\projects\20170401\20170401\sy14.cpp(132): error C2440: “return”: 无法从“datatype”转换为“BiTree”
1> d:\visual studio 2015\projects\20170401\20170401\sy14.cpp(132): note: 从整型转换为指针类型要求 reinterpret_cast、C 样式转换或函数样式转换
高手讨教,怎么修改
解决方案
100
可以这样改:
#include<stdio.h>
#include<stdlib.h>
typedef char datatype;
typedef struct tnode {
datatype data;
struct tnode *lchild, *rchild;
} BiTNode, *BiTree;
void visit(BiTree p); /*输出p指针指向的结点*/
void Preorder(BiTree T); /*前序遍历*/
void Inorder(BiTree T); /*中序遍历*/
void Postorder(BiTree T); /*后序遍历*/
BiTree CreateTree(); /*以前序遍历的顺序建立二叉树*/
int deep(BiTree T); /*求二叉树深度*/
int leaf(BiTree T); /*求叶子结点数*/
int OneChild(BiTree T); /*求1度结点数*/
int TwoChild(BiTree T); /*求2度结点数*/
void Exchange(BiTree T); /*二叉树左右子树交换*/
datatype InorderLastNode(BiTree T); /*找二叉树中序遍历最后一个结点*/
void visit(BiTree p) { /*输出p指针指向的结点*/
if (p->data != " ") {
printf("%c ", p->data);
}
}
void Preorder(BiTree T) { /*前序遍历*/
if (T != NULL) {
visit(T); //访问根节点
Preorder(T->lchild); //访问左子节点
Preorder(T->rchild); //访问右子节点
}
}
void Inorder(BiTree T) { /*中序遍历*/
if (T != NULL) {
Inorder(T->lchild); //访问左子节点
visit(T); //访问根节点
Inorder(T->rchild); //访问右子节点
}
}
void Postorder(BiTree T) { /*后序遍历*/
if (T != NULL) {
Postorder(T->lchild); //访问左子节点
Postorder(T->rchild); //访问右子节点
visit(T); //访问根节点
}
}
BiTree CreateTree() { /*以前序遍历的顺序建立二叉树*/
char ch;
BiTree T;
if ((ch = getchar()) == " ") {
return NULL;
}
else {
T = (BiTree)malloc(sizeof(BiTNode)); //生成根节点
T->data = ch;
T->lchild = CreateTree(); //构造左子树
T->rchild = CreateTree(); //构造右子树
return T;
}
}
int deep(BiTree T) { /*求二叉树深度*/
if (T) {
int leftdeep = deep(T->lchild);
int rightdeep = deep(T->rchild);
return leftdeep >= rightdeep ? leftdeep + 1 : rightdeep + 1;
}
else {
return 0;
}
}
int leaf(BiTree T) { /*求叶子结点数*/
int m, n;
if (!T) { /*空树没有叶子*/
return 0;
}
else if(!T->lchild&&!T->rchild){ /*叶子结点*/
return 1;
}
else { /*左子树的结点数加上右子树的结点数*/
m = leaf(T->lchild);
n = leaf(T->rchild);
return m + n;
}
}
int OneChild(BiTree T) { /*求1度结点数*/
int n = 0;
if (T == NULL) {
return 0;
}
else if ((T->lchild == NULL&&T->rchild != NULL) || (T->lchild != NULL&&T->rchild == NULL)) {
n = 1;
}
return OneChild(T->lchild) + OneChild(T->rchild) + n;
}
int TwoChild(BiTree T) { /*求2度结点数*/
int n = 0;
if (T == NULL) {
return 0;
}
else if ((T->lchild!=NULL&&T->rchild!=NULL))
{
n = 1;
}
return TwoChild(T->lchild) + TwoChild(T->rchild) + n;
}
void Exchange(BiTree T) { /*二叉树左右子树交换*/
if (T) {
BiTree temp = T->lchild;
T->lchild = T->rchild;
T->rchild = temp;
Exchange(T->lchild);
Exchange(T->rchild);
}
}
datatype InorderLastNode(BiTree T) { /*找二叉树中序遍历最后一个结点*/
datatype s;
if (T) {
InorderLastNode(T->lchild);
s = T->data;
InorderLastNode(T->rchild);
}
return s;
}
int main() {
BiTree T;
T = CreateTree();
printf("\n以前序遍历的二叉树:");
printf("\n先序遍历:");
Preorder(T);
printf("\n");
printf("\n中序遍历:");
Inorder(T);
printf("\n");
printf("\n后序遍历:");
Postorder(T);
printf("\n");
printf("\n树的深度=%d\n", deep(T));
printf("1度结点数=%d\n", OneChild(T));
printf("2度结点数=%d\n", TwoChild(T));
Exchange(T);
printf("\n");
InorderLastNode(T);
return 0;
}
50
BiTree InorderLastNode(BiTree T) { /*找二叉树中序遍历最后一个结点*/
datatype s;
if (T) {
InorderLastNode(T->lchild);
s = T->data;
InorderLastNode(T->rchild);
}
return s;
}
这段程序也可以这样改
BiTree *InorderLastNode(BiTree T) { /*找二叉树中序遍历最后一个结点*/
BiTree *Result =NULL;
if(T->lchild) {
Result = InorderLastNode(T->lchild);
} else if(T->rchild) {
Result = InorderLastNode(T->lchild);
} else {
Result = T;
}
return Result;
}