题目中要求将数的数据先存储到字符串中,
比如https://acm.sdut.edu.cn/onlinejudge3/problems/2136
这个题目中,也要求,数的中序遍历,后序遍历,高度和叶子结点的个数,我写本文的目的并不是要记录这些问题,不过在最后附上相应的函数。
肯定先定义一个字符串。
char str[100];
然后,在写建树的函数(我就是在这里,有问题)
我先把,显示遍历结果的函数写出来
void display_DLR(BT *root) { if(root != NULL) { cout<<root->data; display_DLR(root->l); display_DLR(root->r); } else return ; }
现在,主要讨论建树的函数的写法
我之前最初想到的是这样的
BT *creat_DLR(char *dlr) { BT *root; if(*dlr == ‘,‘) root = NULL; else { root = new BT; root->data = *dlr; root->l = creat_DLR(++dlr); root->r = creat_DLR(++dlr); } return root; }
但是,显示不出想要的结果,通过debug发现
以字符串
12,,3,,
建树的过程为例,
当递归过程回到,
建立 1 的建树过程时,参数
*dlr
的值为,1
但并不是,我期待的3
我理解的是,在1的建树过程中,dlr 的值为1。
后来,我想这样来写,但是还是没有成功,具体如下。
BT *creat_DLR(char *dlr) { BT *root; static int i = 0;//因为之前,直接int i = 0; 但是,然后下面的代码和现在一样。我感觉和上面的没有什么差别。 if(*dlr == ‘,‘) root = NULL; else { root = new BT; root->data = *dlr; root->l = creat_DLR(dlr + (++i)); root->r = creat_DLR(dlr + (++i)); } return root; }
当然,还是没有显示预期的结果,通过debug发现,
这可能和函数的传值过程有关,每此新进入到一个creat_DLR( )函数之后,*dir变为下一个字符,
然后,在加上静态变量i 的值,显然,几次进入新的函数时,静态变量 i 会,变得比较大,
dlr再加上 i 之后,跳过了一些字符。
最后,只好借助全局变量,来实现这个功能。
代码如下,
#include<bits/stdc++.h> using namespace std; typedef struct node { char data; struct node *l,*r; }BT; char str[1000];// 存储DLR序列。 int i;// 用来记录下标 BT *creat_DLR() { BT *root; i++; if(str[i-1] == ‘,‘)//在一开始,i++,所以在这里减去1。 root = NULL; else { root = new BT; root->data = str[i-1];//在一开始,i++,所以在这里减去1。 root->l = creat_DLR(); root->r = creat_DLR(); } //我之前把i++;放在了这个位置,没有运行处结果,debug发现,当str[i] != ‘,‘时,进入到一个函数中,并没有起到i++,的效果。 //所以,放到了最开始。 return root; } void display_DLR(BT *root) { if(root != NULL) { cout<<root->data; display_DLR(root->l); display_DLR(root->r); } else return ; } int main() { while(cin>>str) { i = 0; BT *root = creat_DLR(); display_DLR(root); cout<<endl; } return 0; }
我想,知道,不接注全局变量能不能实现。
不过,我发现,这个题好像不用存储到字符中,就能过
代码(AC 文首提到的题目)如下,
#include<bits/stdc++.h> using namespace std; typedef struct node { char data; struct node *l,*r; } BT; BT *creat_DLR() { BT *root; char temp; cin>>temp; if(temp == ‘,‘) root = NULL; else { root = new BT; root->data = temp; root->l = creat_DLR(); root->r = creat_DLR(); } return root; } void display_DLR(BT *root) { if(root == NULL) return ; else { cout<<root->data; display_DLR(root->l); display_DLR(root->r); } } void display_LDR(BT *root) { if(root == NULL) return ; else { display_LDR(root->l); cout<<root->data; display_LDR(root->r); } } void display_LRD(BT *root) { if(root == NULL) return ; else { display_LRD(root->l); display_LRD(root->r); cout<<root->data; } } unsigned int depth_tree(BT *root) { if(root == NULL) return 0; else { unsigned int l_depth = depth_tree(root->l); unsigned int r_depth = depth_tree(root->r); return (l_depth > r_depth ? l_depth : r_depth) + 1;// 因为根节点也算一层,所以加一。 } } unsigned int leave_tree(BT *root) { if(root == NULL) return 0; else if(root->l == NULL && root->r == NULL) return 1; else return leave_tree(root->l) + leave_tree(root->r); } int main() { //while(1) { BT *root = creat_DLR(); display_LDR(root); cout<<endl; display_LRD(root); cout<<endl; cout<<leave_tree(root); cout<<endl; cout<<depth_tree(root); } return 0; }
附录:
void display_DLR(BT *root) { if(root != NULL) { cout<<root->data; display_DLR(root->l); display_DLR(root->r); } } void display_LDR(BT *root) { if(root != NULL) { display_LDR(root->l); cout<<root->data; display_LDR(root->r); } } void display_LRD(BT *root) { if(root != NULL) { display_LRD(root->l); display_LRD(root->r); cout<<root->data; } } void display_level(BT *root) { BT *que[1000];//最多的个数; int out = 0, in = 0; if(root != NULL) { que[in++] = root; while(out < in ) { if(que[out]->l != NULL) que[in++] = que[out]->l; if(que[out]->r != NULL) que[in++] = que[out]->r; out++; } cout<<"out: "<<out<<"in "<<in<<endl; for(int i = 0; i < in; i++) cout<<que[i]->data; cout<<endl; } else return; } int depth(BT *root) { if( root == NULL) return 0; int left = depth(root->l); int right = depth(root->r); return left > right ? left + 1 : right + 1; }
原文:https://www.cnblogs.com/zhang-zsq/p/12896791.html