数据结构中非递归遍历的概念
时间: 2024-05-16 20:10:43 浏览: 116
非递归遍历是指在不使用递归函数的情况下,对数据结构进行遍历的方法。通常情况下,非递归遍历使用栈来模拟递归过程,将递归函数中需要保存的信息压入栈中,然后在循环中模拟递归过程,直到遍历完成。常见的非递归遍历包括中序遍历、前序遍历和后序遍历等。
以中序遍历为例,我们可以通过非递归方式实现如下:
1. 将根节点压入栈中。
2. 如果当前节点有左子节点,则将左子节点压入栈中,并将其标记为已访问。
3. 如果当前节点没有左子节点或者左子节点已经被访问过,则弹出栈顶元素并访问。
4. 如果当前节点有右子节点,则将右子节点压入栈中,并将其标记为未访问。
5. 重复2-4步骤,直到栈为空。
相关问题
树形结构递归遍历java
树形结构递归遍历是指通过递归的方式按照一定的规则遍历树中的节点。在Java中,可以使用以下方式进行树形结构递归遍历:
1. 先序遍历(Preorder Traversal):先访问根节点,然后递归地遍历左子树和右子树。
2. 中序遍历(Inorder Traversal):先递归地遍历左子树,然后访问根节点,最后递归地遍历右子树。
3. 后序遍历(Postorder Traversal):先递归地遍历左子树和右子树,最后访问根节点。
下面是一个示例代码,展示了如何使用递归进行树形结构的先序遍历:
```java
class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int val) {
this.val = val;
}
}
public class TreeTraversal {
public static void preorderTraversal(TreeNode root) {
if (root == null) {
return;
}
System.out.print(root.val + " "); // 访问根节点
preorderTraversal(root.left); // 递归遍历左子树
preorderTraversal(root.right); // 递归遍历右子树
}
public static void main(String[] args) {
// 构建一个二叉树
TreeNode root = new TreeNode(1);
root.left = new TreeNode(2);
root.right = new TreeNode(3);
root.left.left = new TreeNode(4);
root.left.right = new TreeNode(5);
// 先序遍历
System.out.println("先序遍历结果:");
preorderTraversal(root);
}
}
```
输出结果为:1 2 4 5 3
c语言数据结构二叉树的非递归遍历代码
二叉树的非递归遍历通常使用栈来实现。以下是三种非递归遍历方式的代码实现:
1. 非递归中序遍历:
```
void inorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* cur = root;
while (cur != nullptr || !st.empty()) {
if (cur != nullptr) {
st.push(cur);
cur = cur->left;
} else {
cur = st.top();
st.pop();
cout << cur->val << " ";
cur = cur->right;
}
}
}
```
2. 非递归先序遍历:
```
void preorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
if (root != nullptr) {
st.push(root);
}
while (!st.empty()) {
TreeNode* cur = st.top();
st.pop();
cout << cur->val << " ";
if (cur->right != nullptr) {
st.push(cur->right);
}
if (cur->left != nullptr) {
st.push(cur->left);
}
}
}
```
3. 非递归后序遍历:
```
void postorderTraversal(TreeNode* root) {
stack<TreeNode*> st;
TreeNode* prev = nullptr;
if (root != nullptr) {
st.push(root);
}
while (!st.empty()) {
TreeNode* cur = st.top();
if ((cur->left == nullptr && cur->right == nullptr) || (prev != nullptr && (prev == cur->left || prev == cur->right))) {
cout << cur->val << " ";
st.pop();
prev = cur;
} else {
if (cur->right != nullptr) {
st.push(cur->right);
}
if (cur->left != nullptr) {
st.push(cur->left);
}
}
}
}
```