先序遍历创建二叉树
时间: 2023-10-04 14:12:17 浏览: 117
好的,先序遍历创建二叉树的过程如下:
1. 读入当前节点的值,如果是空节点则返回 null。
2. 创建一个新节点,将读入的值赋给该节点。
3. 递归创建左子树,将返回值赋给当前节点的左子节点。
4. 递归创建右子树,将返回值赋给当前节点的右子节点。
5. 返回当前节点。
具体的实现可以参考以下代码:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def buildTree(preorder):
if not preorder:
return None
root_val = preorder.pop(0)
if root_val is None:
return None
root = TreeNode(root_val)
root.left = buildTree(preorder)
root.right = buildTree(preorder)
return root
```
这里假设先序遍历序列中用 None 表示空节点。调用 buildTree(preorder) 即可返回根节点。
相关问题
C语言写代码实验要求: 1.先序遍历创建二叉树; 2.中序线索化二叉树; 3.分别通过 找前驱 和 找后继 的方式,遍历中序线索二叉树。
好的,以下是C语言的代码实现。
1. 先序遍历创建二叉树
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node *left;
struct node *right;
} Node;
Node *create_tree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
Node *root = (Node *) malloc(sizeof(Node));
root->data = ch;
root->left = create_tree();
root->right = create_tree();
return root;
}
void pre_order_traversal(Node *root) {
if (root == NULL) {
return;
}
printf("%c ", root->data);
pre_order_traversal(root->left);
pre_order_traversal(root->right);
}
int main() {
printf("请输入先序遍历的字符序列:\n");
Node *root = create_tree();
printf("先序遍历结果:\n");
pre_order_traversal(root);
return 0;
}
```
2. 中序线索化二叉树
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node *left;
struct node *right;
int ltag; // 左线索标记
int rtag; // 右线索标记
} Node;
Node *create_tree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
Node *root = (Node *) malloc(sizeof(Node));
root->data = ch;
root->left = create_tree();
root->right = create_tree();
root->ltag = 0;
root->rtag = 0;
return root;
}
Node *pre_node(Node *p) {
Node *q = p->left;
while (q->rtag == 0) {
q = q->right;
}
return q;
}
Node *next_node(Node *p) {
Node *q = p->right;
if (p->rtag == 0) {
return pre_node(q);
}
return q;
}
void in_threading(Node *p, Node **pre) {
if (p == NULL) {
return;
}
in_threading(p->left, pre);
if (p->left == NULL) {
p->ltag = 1;
p->left = *pre;
}
if (*pre != NULL && (*pre)->right == NULL) {
(*pre)->rtag = 1;
(*pre)->right = p;
}
*pre = p;
in_threading(p->right, pre);
}
void in_order_traversal(Node *root) {
Node *p = root;
while (p->ltag == 0) {
p = p->left;
}
while (p != NULL) {
printf("%c ", p->data);
p = next_node(p);
}
}
int main() {
printf("请输入先序遍历的字符序列:\n");
Node *root = create_tree();
Node *pre = NULL;
in_threading(root, &pre);
printf("中序遍历结果:\n");
in_order_traversal(root);
return 0;
}
```
3. 找前驱和找后继的方式遍历中序线索二叉树
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node *left;
struct node *right;
int ltag; // 左线索标记
int rtag; // 右线索标记
} Node;
Node *create_tree() {
char ch;
scanf("%c", &ch);
if (ch == '#') {
return NULL;
}
Node *root = (Node *) malloc(sizeof(Node));
root->data = ch;
root->left = create_tree();
root->right = create_tree();
root->ltag = 0;
root->rtag = 0;
return root;
}
Node *pre_node(Node *p) {
Node *q = p->left;
while (q->rtag == 0) {
q = q->right;
}
return q;
}
Node *next_node(Node *p) {
Node *q = p->right;
if (p->rtag == 0) {
return pre_node(q);
}
return q;
}
void in_threading(Node *p, Node **pre) {
if (p == NULL) {
return;
}
in_threading(p->left, pre);
if (p->left == NULL) {
p->ltag = 1;
p->left = *pre;
}
if (*pre != NULL && (*pre)->right == NULL) {
(*pre)->rtag = 1;
(*pre)->right = p;
}
*pre = p;
in_threading(p->right, pre);
}
void in_order_traversal(Node *root) {
Node *p = root;
while (p->ltag == 0) {
p = p->left;
}
while (p != NULL) {
printf("%c ", p->data);
p = next_node(p);
}
}
void pre_order_traversal(Node *root) {
if (root == NULL) {
return;
}
printf("%c ", root->data);
if (root->ltag == 0) {
pre_order_traversal(root->left);
}
if (root->rtag == 0) {
pre_order_traversal(root->right);
}
}
int main() {
printf("请输入先序遍历的字符序列:\n");
Node *root = create_tree();
Node *pre = NULL;
in_threading(root, &pre);
printf("中序遍历结果:\n");
in_order_traversal(root);
printf("\n先序遍历结果:\n");
pre_order_traversal(root);
return 0;
}
```
如何用先序遍历建立二叉树数据结构
以下是使用先序遍历建立二叉树的Python代码:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
class Solution:
def buildTree(self, preorder: List[int]) -> TreeNode:
if not preorder:
return None
root = TreeNode(preorder[0])
stack = [root]
for i in range(1, len(preorder)):
if preorder[i] < stack[-1].val:
stack[-1].left = TreeNode(preorder[i])
stack.append(stack[-1].left)
else:
while stack and preorder[i] > stack[-1].val:
last = stack.pop()
last.right = TreeNode(preorder[i])
stack.append(last.right)
return root
```
其中,TreeNode类表示二叉树的节点,buildTree函数接收一个先序遍历的列表,返回一个二叉树的根节点。具体实现过程如下:
1. 如果先序遍历列表为空,则返回None。
2. 创建根节点,将其入栈。
3. 从第二个元素开始遍历先序遍历列表,如果当前元素小于栈顶元素的值,则将其作为栈顶元素的左子节点,并将其入栈。
4. 如果当前元素大于栈顶元素的值,则不断弹出栈顶元素,直到栈为空或者当前元素小于栈顶元素的值。将当前元素作为最后一个弹出的节点的右子节点,并将其入栈。
5. 遍历完先序遍历列表后,返回根节点。
阅读全文