二叉树遍历(用结构体数组存储)算法
时间: 2023-08-04 18:24:43 浏览: 109
二叉树的遍历算法
二叉树遍历可以通过结构体数组存储实现,具体算法步骤如下:
1. 定义二叉树的结构体,包括节点值、左子节点和右子节点。
```
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
};
```
2. 定义结构体数组,用于存储二叉树节点的值。
```
struct Node {
int val;
bool visited;
};
```
其中,visited 表示该节点是否已被访问过。
3. 创建二叉树,将结构体数组中的值存储到二叉树中。
```
TreeNode* createTree(Node* nodes, int n, int i) {
if (i >= n || nodes[i].val == -1) {
return NULL;
}
TreeNode* root = new TreeNode();
root->val = nodes[i].val;
root->left = createTree(nodes, n, 2 * i + 1);
root->right = createTree(nodes, n, 2 * i + 2);
return root;
}
```
其中,n 表示结构体数组的长度,i 表示当前节点在结构体数组中的位置。
4. 中序遍历二叉树,将遍历结果存储到另一个结构体数组中。
```
void inOrder(TreeNode* root, Node* nodes, int& i) {
if (!root) {
return;
}
inOrder(root->left, nodes, i);
nodes[i].val = root->val;
nodes[i].visited = false;
i++;
inOrder(root->right, nodes, i);
}
```
其中,i 表示当前节点在结构体数组中的位置。
5. 实现遍历函数,通过结构体数组实现二叉树的遍历。
```
void traverse(Node* nodes, int n, TreeNode* root) {
stack<TreeNode*> s;
int i = 0;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
if (!node) {
continue;
}
if (!nodes[i].visited) {
cout << node->val << " ";
nodes[i].visited = true;
} else {
s.push(node->right);
}
s.push(node);
s.push(node->left);
i++;
}
}
```
其中,使用栈实现二叉树的遍历,节点访问的顺序与入栈的顺序相同,遍历过程中使用结构体数组记录每个节点是否已被访问过。
通过结构体数组存储二叉树,可以方便地实现对二叉树的遍历操作,并且可以避免指针操作带来的风险和复杂性。
阅读全文