以二叉链表表示二叉树,建立一个二叉树,并实现先序,中序,后序,层序遍历,然后计算二叉树的高度和叶子结点个数
时间: 2023-06-07 12:06:55 浏览: 113
编写采用二叉链表形式存储的二叉树的创建、先序、中序、后序和按层遍历的算法
5星 · 资源好评率100%
好的,我可以帮你回答这个问题。
首先,让我们来定义二叉链表表示二叉树的数据结构。每个节点都包括三个属性:data、left和right,分别表示节点的值、左子树和右子树。
接下来,我们可以编写代码来建立二叉树。以下是一个示例代码:
```
#include <iostream>
#include <queue>
using namespace std;
struct TreeNode {
int data;
TreeNode *left;
TreeNode *right;
TreeNode(int val) : data(val), left(nullptr), right(nullptr) {}
};
TreeNode* createBinaryTree() {
int val;
cin >> val;
if (val == -1) {
return nullptr;
}
TreeNode *root = new TreeNode(val);
root->left = createBinaryTree();
root->right = createBinaryTree();
return root;
}
```
以上代码中,createBinaryTree()函数将以递归方式创建二叉树。用户输入每个节点的值,如果值为-1,则表示该节点为空。如果值不为-1,则创建一个新节点,并递归调用createBinaryTree()函数以创建其左右子树。
接下来,我们可以实现先序、中序、后序和层序遍历。以下是示例代码:
```
void preorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
cout << root->data << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
void inorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
inorderTraversal(root->left);
cout << root->data << " ";
inorderTraversal(root->right);
}
void postorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->data << " ";
}
void levelorderTraversal(TreeNode* root) {
if (root == nullptr) {
return;
}
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
cout << node->data << " ";
if (node->left != nullptr) {
q.push(node->left);
}
if (node->right != nullptr) {
q.push(node->right);
}
}
}
```
以上代码中,preorderTraversal()、inorderTraversal()和postorderTraversal()分别实现了先序、中序和后序遍历。levelorderTraversal()实现了层序遍历,使用了一个队列来保存遍历的节点。
最后,我们可以计算二叉树的高度和叶子结点个数。以下是示例代码:
```
int getHeight(TreeNode* root) {
if (root == nullptr) {
return 0;
}
int leftHeight = getHeight(root->left);
int rightHeight = getHeight(root->right);
return max(leftHeight, rightHeight) + 1;
}
int getLeafCount(TreeNode* root) {
if (root == nullptr) {
return 0;
}
if (root->left == nullptr && root->right == nullptr) {
return 1;
}
return getLeafCount(root->left) + getLeafCount(root->right);
}
```
getHeight()函数递归计算二叉树的高度,getLeafCount()函数递归计算叶子结点的个数。
希望我的回答能对你有所帮助。
阅读全文