用c++实现对任意给定的二叉树完成下列操作: (1)根据输入的序列,建立二叉链表存储结构: (2)输出该二叉树的先序、中序、后序遍历结果(递归算法); (3)先序遍历二叉树(非递归算法);(4)借助队列实现二叉树的层次遍历;(5)求二叉树的高度; (6)求二叉树叶子结点个数: (7)将二叉链表视为树或森林的孩子兄弟链表,计算其叶子结点个数。
时间: 2024-02-17 08:04:52 浏览: 93
这是基本数据结构及其算法的C++实现,涉及单链表、双链表、栈 、二叉树、并查集、哈夫曼树、平衡二叉树、二叉搜索树等.zip
好的,我会根据你的要求回答问题。以下是用C++实现的代码:
```c++
#include <iostream>
#include <stack>
#include <queue>
using namespace std;
// 二叉树结点的定义
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 根据输入的序列,建立二叉链表存储结构
void buildTree(TreeNode*& root) {
int val;
cin >> val;
if (val == -1) {
root = NULL;
return;
}
root = new TreeNode(val);
buildTree(root->left);
buildTree(root->right);
}
// 输出二叉树的先序遍历结果
void preorderTraversal(TreeNode* root) {
if (root == NULL) return;
cout << root->val << " ";
preorderTraversal(root->left);
preorderTraversal(root->right);
}
// 输出二叉树的中序遍历结果
void inorderTraversal(TreeNode* root) {
if (root == NULL) return;
inorderTraversal(root->left);
cout << root->val << " ";
inorderTraversal(root->right);
}
// 输出二叉树的后序遍历结果
void postorderTraversal(TreeNode* root) {
if (root == NULL) return;
postorderTraversal(root->left);
postorderTraversal(root->right);
cout << root->val << " ";
}
// 先序遍历二叉树(非递归算法)
void preorderTraversalNonRecursive(TreeNode* root) {
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode* node = s.top();
s.pop();
if (node == NULL) continue;
cout << node->val << " ";
s.push(node->right);
s.push(node->left);
}
}
// 借助队列实现二叉树的层次遍历
void levelOrderTraversal(TreeNode* root) {
queue<TreeNode*> q;
q.push(root);
while (!q.empty()) {
TreeNode* node = q.front();
q.pop();
if (node == NULL) continue;
cout << node->val << " ";
q.push(node->left);
q.push(node->right);
}
}
// 求二叉树的高度
int getHeight(TreeNode* root) {
if (root == NULL) return 0;
return max(getHeight(root->left), getHeight(root->right)) + 1;
}
// 求二叉树叶子结点个数
int getLeafCount(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL) return 1;
return getLeafCount(root->left) + getLeafCount(root->right);
}
// 将二叉链表视为树或森林的孩子兄弟链表,计算其叶子结点个数
int getLeafCount2(TreeNode* root) {
if (root == NULL) return 0;
if (root->left == NULL && root->right == NULL) return 1;
return getLeafCount2(root->left) + getLeafCount2(root->right);
}
int main() {
TreeNode* root = NULL;
buildTree(root);
cout << "先序遍历结果:";
preorderTraversal(root);
cout << endl;
cout << "中序遍历结果:";
inorderTraversal(root);
cout << endl;
cout << "后序遍历结果:";
postorderTraversal(root);
cout << endl;
cout << "先序遍历结果(非递归算法):";
preorderTraversalNonRecursive(root);
cout << endl;
cout << "层次遍历结果:";
levelOrderTraversal(root);
cout << endl;
cout << "树的高度:" << getHeight(root) << endl;
cout << "叶子结点个数:" << getLeafCount(root) << endl;
cout << "叶子结点个数(孩子兄弟链表):" << getLeafCount2(root) << endl;
return 0;
}
```
注意:在输入序列时,-1代表该结点为空。
阅读全文