C语言给出一个按照“扩展遍历序列”的扩展后序遍历序列字符串,'#' 代表空的子节点,大写字母代表节点内容。通过字符串建立二叉树,并按横向显示的树状打印的二叉树
时间: 2024-04-29 14:26:07 浏览: 115
c代码-二叉树的建立以及先序、中序、后序遍历C语言实现
请问如何通过该字符串构建出原二叉树?
在构建原二叉树时,可以从扩展后序遍历序列的最后一个元素开始,逆向推导出每个节点的左右子树,并以此构建出整个二叉树。具体实现过程如下:
1. 将扩展后序遍历序列字符串倒序存储到一个栈中;
2. 从栈中依次取出一个元素,如果它是 "# "(表示空节点),则将一个空节点入栈;
3. 如果它是一个数字,将该数字转换为一个节点,并将该节点入栈;
4. 如果它是一个字母 "L" 或 "R",则表示该节点是它前一个节点的左子树或右子树,将前一个节点出栈,并将该节点连接到前一个节点的相应位置上;
5. 循环上述过程,直到栈为空,则构建出原二叉树。
具体代码实现如下(假设扩展后序遍历序列字符串存储在变量 str 中):
```c
typedef struct Node* Tree;
struct Node {
char data;
Tree left;
Tree right;
};
Tree buildTree(char* str) {
int len = strlen(str);
Tree root = NULL;
Node* stack[100];
int top = -1;
for (int i = len - 1; i >= 0; i--) {
if (str[i] == '#') {
stack[++top] = NULL;
} else if (isdigit(str[i])) {
int j = i;
while (isdigit(str[j])) j--;
char data[10];
strncpy(data, str+j+1, i-j);
Node* node = new Node;
node->data = atoi(data);
node->left = NULL;
node->right = NULL;
stack[++top] = node;
i = j + 1;
} else if (str[i] == 'L' || str[i] == 'R') {
Node* node = stack[top--];
if (root == NULL) {
root = node;
} else if (str[i] == 'L') {
node->left = stack[top];
} else {
node->right = stack[top];
}
}
}
return root;
}
```
阅读全文