自己动手写二叉树的创建时出现了一个问题
#include <stdio.h>
#include <stdlib.h>
typedef struct _BinNode BinNode;
struct _BinNode{
char ch;
BinNode * left;
BinNode * right;
};
void CreateNode(BinNode * binNode){
char ch;
scanf("%c",&ch);
if(ch=='*'){
binNode=NULL;
}
else{
binNode=(BinNode*)malloc(sizeof(BinNode));
binNode->ch=ch;
CreateNode(binNode->left);
CreateNode(binNode->right);
}
}
void PreShow(BinNode *binNode){
if(!binNode){
return;
}
else{
printf("%c",binNode->ch);
PreShow(binNode->left);
PreShow(binNode->right);
}
}
int main(){
BinNode * binNode;
printf("请输入二叉树前序遍历结果:");
CreateNode(binNode);
printf("前序遍历结果:");
PreShow(binNode);
return 0;
}
这样写貌似没什么问题,但是运行结果却不能达到预期所想
通过debug发现二叉树没有创建好,核实了一遍代码,也没有什么逻辑问题,最后对照源码发现了的问题
源码用的是指针的指针**CreateNode(BinNode binNode)
于是百思不得其解,一层指针就可以解决问题,最后在看了几篇文章
自己动手再写的时候发现了问题:
函数对指针进行修改,如果参数为指针,那么传递的是指针的副本,真正的指针并没有修改,就像swap(int a ,int b)不能交换a,b的值一个道理
对于函数修改指针的值,参数应当是指针的指针才行,就如同swap(int* a,int* b)一个道理
这是修改后的代码
#include <stdio.h>
#include <stdlib.h>
typedef struct _BinNode BinNode;
struct _BinNode{
char ch;
BinNode * left;
BinNode * right;
};
//指针的指针
void CreateNode(BinNode ** binNode){
char ch;
scanf("%c",&ch);
if(ch=='*'){
*binNode=NULL;
}
else{
*binNode=(BinNode*)malloc(sizeof(BinNode));
(*binNode)->ch=ch;
CreateNode(&(*binNode)->left);
CreateNode(&(*binNode)->right);
}
}
void PreShow(BinNode *binNode){
if(!binNode){
return;
}
else{
printf("%c",binNode->ch);
PreShow(binNode->left);
PreShow(binNode->right);
}
}
int main(){
BinNode * binNode;
printf("请输入二叉树前序遍历结果:");
CreateNode(&binNode);
printf("前序遍历结果:");
PreShow(binNode);
return 0;
}
运行结果