(一)构建一个二叉树
参考https://ask.csdn.net/questions/218120
1.定义结点的结构体
这里的结点内数据是一个字符数组,所以要注意,C++中字符数组的比较和赋值,不能是直接的==、=之类的
要引用头文件<cstring>,内有strcpy等方法
字符串、字符数组比较的具体请看——https://blog.csdn.net/mirage_dw/article/details/81608626
struct node{
char data[10];
struct node *left,*right;
};
2.函数
void CreateTree(BinTree *root){
char input[10];
cout<<"please input node data"<<endl;
cin>>input;
//如果输入为#,表示当前节点不存在
if(strcmp(input,"#") ==0 ){
cout<<"leaf"<<endl;
return;
}
//先根据输入数创建一个节点
else{
BinTree* newnode = new BinTree;
strcpy(newnode->data,input);
newnode->left = NULL;
newnode->right = NULL;
root = newnode;
CreateTree(root->left);
CreateTree(root->right);
return;
}
return;
}
* strncpy()相比strcpy(),存放安全问题(具体没看)
编译执行上述代码,当输入到某个叶节点时,需要再输入#来结束
但是我看其他人的代码,还会考虑当前节点是否空节点等等问题?
这版代码相比之下比较简洁,当然,也可以修改返回值,返回一个tree(node指针节点指向root)
* 写的时候还要注意一点,node不能直接和NULL相比较,一定是node* 指针类型,这里定义的新节点等都是node* 类型的
以及
BinTree* newnode = new BinTree;
struct node* newnode = NULL;
这两个语句前面的BinTree就是struct node的别名,所以含义一样,但是后面的如果将new一个节点空间直接修改为NULL当然是不行的,表示新节点空,后面的代码就不能将数据放入节点中了,所以第二句不对
(二)遍历