目录
递归实现(preorderRecursive函数):首先访问当前节点,然后递归遍历左子树,最后递归遍历右子树。这种遍历方式可以用于深度优先搜索。
2中序遍历(Inorder Traversal):中序遍历的顺序是左子树 -> 根节点 -> 右子树。
3后序遍历(Postorder Traversal):后序遍历的顺序是左子树 -> 右子树 -> 根节点。
4层序遍历(Level Order Traversal):层序遍历按照从上到下、从左到右的顺序遍历每一层的节点。
5深度优先遍历(Depth-First Traversal):深度优先遍历是一种通用的遍历方式,可以根据需要选择前序、中序、后序遍历方式。
以下是C++中二叉树前序、中序、后序遍历的递归和非递归实现,以及层序遍历和深度优先遍历的代码和讲解。
二叉树节点结构:
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
1.1 前序遍历(Preorder Traversal):
前序遍历的顺序是根节点 -> 左子树 -> 右子树。
-
递归实现(
preorderRecursive
函数):首先访问当前节点,然后递归遍历左子树,最后递归遍历右子树。这种遍历方式可以用于深度优先搜索。 -
void preorderRecursive(TreeNode* root) { if (root == NULL) return; cout << root->val << " "; preorderRecursive(root->left); preorderRecursive(root->right); }
-
非递归实现(
preorderIterative
函数): - 使用一个栈来模拟递归,首先将根节点入栈,然后循环直到栈为空。在循环内,将栈顶节点出栈并访问,然后将右子节点和左子节点(如果存在)依次入栈,以确保下一次出栈的是左子节点。这样可以按照根-左-右的顺序遍历树。
void preorderIterative(TreeNode* root) {
if (root == NULL) return;
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
cout << node->val << " ";
if (node->right) s.push(node->right);
if (node->left) s.push(node->left);
}
}