s1.pop(); s2.push(curr); if (curr->left) s1.push(curr->left); if (curr->right) s1.push(curr->right); } while (!s2.empty()) { TreeNode* curr = s2.top(); s2.pop(); result.push_back(curr->val); } return result; } int main() { string preorder = "ABDGCEF"; // 先序序列 string inorder = "DGBAECF"; // 中序序列 TreeNode* root = buildTree(preorder, inorder); // 构建二叉树 vector<char> preorderResult = preorderTraversal(root); // 前序非递归遍历 vector<char> inorderResult = inorderTraversal(root); // 中序非递归遍历 vector<char> postorderResult = postorderTraversal(root); // 后序非递归遍历 // 输出三种遍历序列的结果 cout << "前序非递归遍历: "; for (size_t i = 0; i < preorderResult.size(); i++) { cout << preorderResult[i] << " "; } cout << endl; cout << "中序非递归遍历: "; for (size_t i = 0; i < inorderResult.size(); i++) { cout << inorderResult[i] << " "; } cout << endl; cout << "后序非递归遍历: "; for (size_t i = 0; i < postorderResult.size(); i++) { cout << postorderResult[i] << " "; } cout << endl; return 0; }
时间: 2023-06-17 20:07:02 浏览: 107
这是一个用 C++ 实现的二叉树构建和三种非递归遍历的代码。在这个代码中,先序遍历、中序遍历和后序遍历都采用非递归的方式实现。这个代码的具体实现过程如下:
1. 首先,根据给定的先序序列和中序序列构建二叉树。这里使用了递归的方式构建二叉树,具体实现可参考 LeetCode 题目 105。
2. 然后,分别实现三种非递归遍历方式。具体实现过程如下:
- 前序遍历:使用一个栈来保存遍历过的节点。首先将根节点入栈,然后循环执行以下操作,直到栈为空。从栈中弹出一个节点,将节点的值保存到结果数组中,然后将节点的右子节点和左子节点依次入栈。
- 中序遍历:使用一个栈来保存遍历过的节点。首先将根节点入栈,然后循环执行以下操作,直到栈为空。从栈中弹出一个节点,如果该节点有左子节点,则将左子节点入栈。如果该节点没有左子节点或者左子节点已经被访问过了,则将节点的值保存到结果数组中,然后将节点的右子节点入栈。
- 后序遍历:使用两个栈来保存遍历过的节点。首先将根节点入栈1,然后循环执行以下操作,直到栈1为空。从栈1中弹出一个节点,并将该节点入栈2。然后依次将该节点的左子节点和右子节点入栈1。最后,从栈2中依次弹出节点,并将节点的值保存到结果数组中。
3.最后,在 main 函数中分别调用三种非递归遍历函数,并输出遍历结果。
需要注意的是,这个代码中使用了自定义的 TreeNode 结构体来表示二叉树节点,其定义可能与 LeetCode 题目中的定义略有不同。
阅读全文