知道层次遍历和中序遍历
时间: 2023-11-26 12:50:24 浏览: 80
当然知道!层次遍历和中序遍历是二叉树遍历的两种常用方法。
层次遍历(Level Order Traversal)是按照树的层次从上到下,从左到右的顺序依次访问节点。具体实现可以使用队列来辅助,首先将根节点入队,然后循环执行以下步骤:从队列中取出一个节点,访问该节点,然后将其左子节点和右子节点依次入队。直到队列为空,即可完成层次遍历。
中序遍历(Inorder Traversal)是按照左子树-根节点-右子树的顺序依次访问节点。具体实现可以使用递归或者栈来辅助,递归实现时,先递归遍历左子树,然后访问根节点,最后递归遍历右子树。
层次遍历和中序遍历分别适用于不同的场景。层次遍历可以方便地按层次获取树的结构信息,如分层打印树的节点。而中序遍历在二叉搜索树中具有特殊的性质,可以按照从小到大的顺序输出节点值。
希望以上解答能够帮到你!如果还有其他问题,欢迎继续提问。
相关问题
知道二叉树层次遍历和中序遍历构造二叉树
构造二叉树的过程如下:
1. 根据层次遍历确定根节点;
2. 根据中序遍历将左右子树分开;
3. 递归构造左子树和右子树。
具体实现可以使用代码实现,以下是 Python 代码示例:
``` python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def buildTree(level_order, inorder):
if not level_order or not inorder:
return None
# 根据层次遍历确定根节点
root_val = level_order.pop(0)
root = TreeNode(root_val)
# 根据中序遍历将左右子树分开
inorder_idx = inorder.index(root_val)
left_inorder = inorder[:inorder_idx]
right_inorder = inorder[inorder_idx+1:]
# 递归构造左子树和右子树
root.left = buildTree(level_order, left_inorder)
root.right = buildTree(level_order, right_inorder)
return root
```
其中,`level_order`表示二叉树的层次遍历序列,`inorder`表示二叉树的中序遍历序列。调用函数`buildTree(level_order, inorder)`即可构建二叉树。
二叉树层次遍历和中序遍历完整代码
以下是C++实现二叉树层次遍历和中序遍历的完整代码:
```c++
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 生成二叉树
TreeNode* buildTree(vector<int>& preorder, vector<int>& inorder) {
if (preorder.empty() || inorder.empty()) {
return NULL;
}
int rootVal = preorder[0];
TreeNode* root = new TreeNode(rootVal);
int rootIndex = 0;
for (int i = 0; i < inorder.size(); i++) {
if (inorder[i] == rootVal) {
rootIndex = i;
break;
}
}
vector<int> leftPreorder(preorder.begin() + 1, preorder.begin() + rootIndex + 1);
vector<int> rightPreorder(preorder.begin() + rootIndex + 1, preorder.end());
vector<int> leftInorder(inorder.begin(), inorder.begin() + rootIndex);
vector<int> rightInorder(inorder.begin() + rootIndex + 1, inorder.end());
root->left = buildTree(leftPreorder, leftInorder);
root->right = buildTree(rightPreorder, rightInorder);
return root;
}
// 层次遍历
void levelOrder(TreeNode* root) {
if (root == NULL) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
int size = q.size();
for (int i = 0; i < size; i++) {
TreeNode* node = q.front();
q.pop();
cout << node->val << " ";
if (node->left != NULL) {
q.push(node->left);
}
if (node->right != NULL) {
q.push(node->right); }
}
}
}
// 中序遍历
void inorderTraversal(TreeNode* root) {
if (root == NULL) {
return;
}
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
int main() {
vector<int> preorder = { 3,9,20,15,7 };
vector<int> inorder = { 9,3,15,20,7 };
TreeNode* root = buildTree(preorder, inorder);
cout << "层次遍历结果:";
levelOrder(root);
cout << endl;
cout << "中序遍历结果:";
inorderTraversal(root);
cout << endl;
return 0;
}
```
阅读全文