int FindMax(int* p, int m, int n, int* pRow, int* pCol)
{
int i, j, max;
max = p[0];
*pRow = 0; *pCol = 0;
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
if (max < p[i * n + j]) //请问 这一行是怎么遍历数组的,可以改成*(*(p+i)+j)吗?
{
max = p[i * n + j];
*pRow = i;
*pCol = j;
}
}
}
return max;
}
if (max < p[i * n + j])
可以改成
if (max < *(p + i * n + j))
数组是连续存储的,一行之后跟着另一行,所以偏移就是 i*n跳过i行,再跳过j个
描述
编一个程序,读入用户输入的一串先序遍历字符串,根据此字符串建立一个二叉树(以指针方式存储)。 例如如下的先序遍历字符串: ABC##DE#G##F### 其中“#”表示的是空格,空格字符代表空树。建立起此二叉树以后,再对二叉树进行中序遍历,输出遍历结果。
输入描述:
输入包括1行字符串,长度不超过100。
输出描述:
可能有多组测试数据,对于每组数据, 输出将输入字符串建立二叉树后中序遍历的序列,每个字符后面都有一个空格。 每个输出结果占一行。
示例1
输入:
abc##de#g##f###
输出:
c b e g d f a
解答
#include<stdio.h>
#include<stdlib.h>
typedef struct TreeNode
{
struct TreeNode* left;
struct TreeNode* right;
char val;
}TreeNode;
//先序遍历创建二叉树, pi用来当作下标
TreeNode* PrevCreateTree(char str[], int* pi)
{
TreeNode* Node = (TreeNode*)malloc(sizeof(TreeNode));
if(str[*pi] == '#')
{
++(*pi);
return NULL;
}
Node->val = str[*pi];
++(*pi);
Node->left = PrevCreateTree(str, pi);
Node->right = PrevCreateTree(str, pi);
return Node;
}
//中序遍历打印
void InOrder(TreeNode* root)
{
if (root == NULL)
{
return;
}
InOrder(root->left);
printf("%c ", root->val);
InOrder(root->right);
}
int main()
{
char str[100];
scanf("%s", str);
int i = 0;
TreeNode* PrevTree = PrevCreateTree(str, &i);
InOrder(PrevTree);
}