#include <bits/stdc++.h> using namespace std; char tree[4096]; string a; //获取 //返回子节点坐标 int deep(int p) { return pow(2,p); } int ls(int p) { return 2*p; } int rs(int p) { return 2*p+1; } void FBI(int letf,int right,int p) //左界,右界,当前节点序号 { if(left==right) //只有一个元素了 { if(a[letf]=='1') tree[p]='I'; else tree[p]='B'; return ; } int mid=(left+right)/2; //FBI(mid+1,right,p+1); //FBI(left,mid,p+1); FBI(mid+1,right,rs(p)); FBI(left,mid,ls(p)); if(tree[ls(p)]=='I'&&tree[rs(p)]=='I') tree[p]='I'; else if(tree[ls(p)]=='B'&&tree[rs(p)]=='B') tree[p]='B'; else tree[p]='F'; } void postorder(int p) //后序遍历 { if(tree[ls(p)]) postorder(ls(p)); //如果左子节点存在,就往下走 if(tree[rs(p)]) postorder(rs(p)); //直到所有子节点都走完后,开始输出 cout<<tree[p]; } int main () { int n; cin>>n>>a; FBI(1,a.size(),1); postorder(1); return 0; } 为什么无法运行
时间: 2023-12-06 12:42:25 浏览: 30
代码中有一些错误,可能是拼写错误或变量名不匹配等问题。以下是可能需要修改的地方:
1. 在函数 `FBI` 中,参数 `letf` 应该改为 `left`。
2. 在函数 `FBI` 中,应该将变量 `mid` 的计算放在 `if` 语句前面。
3. 在函数 `FBI` 中,递归调用的参数 `p+1` 应该改为 `ls(p)` 或 `rs(p)`。
4. 在函数 `postorder` 中,判断子节点是否存在的条件应该为 `tree[ls(p)] != '\0'` 或 `tree[rs(p)] != '\0'`。
修改后的代码如下:
相关问题
#include <bits/stdc++.h> using namespace std; typedef string ElemType; typedef struct BitNode { ElemType data; struct BitNode *lchild,*rchild; } BitNode,*BiTree; //char sc[10]= {"+-*/"}; void CreateBiTree(BiTree &t) { string ch; cin >> ch; if(ch[0] == '#') t = NULL; else { t = new BitNode; t->data = ch; CreateBiTree(t->lchild); CreateBiTree(t->rchild); } } void InOrderTraverse(BiTree t) { if(t) { string op = t->data; if(op[0]<'0' || op[0]>'9') cout << '('; InOrderTraverse(t->lchild); cout << t->data ; InOrderTraverse(t->rchild); if(op[0]<'0' || op[0]>'9') cout << ')'; } /***********************************/ } int main() { BiTree tree = new BitNode; string ch; while(cin >> ch) { tree->data = ch; CreateBiTree(tree->lchild); CreateBiTree(tree->rchild); InOrderTraverse(tree); printf("\n"); } return 0; }换为c语言
把代码中的头文件改为标准C语言的头文件,去掉using namespace std,把string改为char数组,去掉注释,把printf改为printf_s(或者使用头文件stdio.h中的printf函数)等等,修改后的代码如下:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef char ElemType;
typedef struct BitNode {
ElemType data;
struct BitNode *lchild,*rchild;
} BitNode,*BiTree;
void CreateBiTree(BiTree *t) {
char ch;
scanf("%c", &ch);
if(ch == '#')
*t = NULL;
else
{
*t = (BitNode*)malloc(sizeof(BitNode));
(*t)->data = ch;
CreateBiTree(&((*t)->lchild));
CreateBiTree(&((*t)->rchild));
}
}
void InOrderTraverse(BiTree t) {
if(t) {
char op = t->data;
if(op < '0' || op > '9') {
printf("(");
}
InOrderTraverse(t->lchild);
printf("%c", t->data);
InOrderTraverse(t->rchild);
if(op < '0' || op > '9') {
printf(")");
}
}
}
int main() {
BiTree tree = NULL;
char ch;
while(scanf("%c", &ch) != EOF) {
tree = (BitNode*)malloc(sizeof(BitNode));
tree->data = ch;
CreateBiTree(&(tree->lchild));
CreateBiTree(&(tree->rchild));
InOrderTraverse(tree);
printf_s("\n");
}
return 0;
}
```
#include<bits/stdc++.h> using namespace std; string str; int len; struct treeNode{ char data; treeNode *L_child,*R_child; treeNode(char d){ data=d; } }; template<class T> class Tree{ public: Tree(){ root=NULL; } treeNode* createNode() { treeNode *t; if(len>=str.size()){ return NULL; } T data = str[len++]; if(data=='*'){ t=NULL; }else{ t=new treeNode(data); t->L_child=createNode(); t->R_child=createNode(); } return t; }; treeNode* getRoot(); int getAns(treeNode *root); void LRN(treeNode *root); private: treeNode *root; }; template<class T> treeNode* Tree<T>::getRoot() { return this->root; } template<class T> int Tree<T>::getAns(treeNode *root){ if(root==NULL) return 0; int ans = 0; if(root->L_child!=NULL&&root->R_child!=NULL){ ans=1; } return ans+getAns(root->L_child)+getAns(root->R_child); } int main() { while(cin>>str){ len=0; Tree<char> *tree = new Tree<char>(); treeNode *root = tree->getRoot(); root = tree->createNode(); cout<<tree->getAns(root)<<endl; } }通过代码的功能用c语言来实现
这段代码主要功能是构建一棵二叉树,并计算该二叉树中有多少个节点的左右子树都不为空。在 C 语言中,可以使用结构体和递归函数来实现相同的功能。
以下是使用 C 语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
};
struct Tree {
struct TreeNode *root;
};
typedef struct TreeNode TreeNode;
typedef struct Tree Tree;
TreeNode* createNode(char data) {
TreeNode *node = (TreeNode*) malloc(sizeof(TreeNode));
node->data = data;
node->left = NULL;
node->right = NULL;
return node;
}
TreeNode* createTree(char* str, int* len) {
if (*len >= strlen(str)) {
return NULL;
}
char data = str[(*len)++];
if (data == '*') {
return NULL;
}
TreeNode *node = createNode(data);
node->left = createTree(str, len);
node->right = createTree(str, len);
return node;
}
int getAns(TreeNode *root) {
if (root == NULL) {
return 0;
}
int ans = 0;
if (root->left != NULL && root->right != NULL) {
ans = 1;
}
return ans + getAns(root->left) + getAns(root->right);
}
int main() {
char str[100];
while (scanf("%s", str) != EOF) {
int len = 0;
Tree *tree = (Tree*) malloc(sizeof(Tree));
tree->root = createTree(str, &len);
printf("%d\n", getAns(tree->root));
free(tree);
}
return 0;
}
```
这段代码中,我们定义了两个结构体 TreeNode 和 Tree,分别表示二叉树中的节点和整棵二叉树。在 createNode 函数中,我们通过 malloc 动态分配了一个新的节点,并初始化它的数据和左右子节点指针。在 createTree 函数中,我们使用递归的方式构建二叉树,当遇到字符 '*' 时返回 NULL。在 getAns 函数中,我们递归计算二叉树中满足条件的节点数。在 main 函数中,我们通过 scanf 输入字符串,构建二叉树并计算答案,最后释放内存。
相关推荐
![h](https://img-home.csdnimg.cn/images/20210720083646.png)
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![h](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)