使用二叉链表创建一棵二叉树,并完成如下操作: (1) 对这棵二叉树分别进行先序、中序、后序遍历; (2) 统计这棵二叉树的深度、叶子结点数、结点总数; (3) 销毁这棵二叉树。
时间: 2023-09-03 08:27:49 浏览: 75
### 回答1:
二叉树的二叉链表节点结构如下:
```c++
struct TreeNode {
char data;
TreeNode* leftChild;
TreeNode* rightChild;
};
```
使用先序遍历的方式创建一棵二叉树:
```c++
#include <iostream>
using namespace std;
struct TreeNode {
char data;
TreeNode* leftChild;
TreeNode* rightChild;
};
void createBinaryTree(TreeNode*& root) {
char ch;
cin >> ch;
if (ch == '#') {
root = NULL;
} else {
root = new TreeNode;
root->data = ch;
createBinaryTree(root->leftChild);
createBinaryTree(root->rightChild);
}
}
```
先序、中序、后序遍历的递归实现:
```c++
void preOrder(TreeNode* root) {
if (root) {
cout << root->data << " ";
preOrder(root->leftChild);
preOrder(root->rightChild);
}
}
void inOrder(TreeNode* root) {
if (root) {
inOrder(root->leftChild);
cout << root->data << " ";
inOrder(root->rightChild);
}
}
void postOrder(TreeNode* root) {
if (root) {
postOrder(root->leftChild);
postOrder(root->rightChild);
cout << root->data << " ";
}
}
```
统计二叉树深度、叶子结点数、结点总数的递归实现:
```c++
int depth(TreeNode* root) {
if (!root) {
return 0;
} else {
int leftDepth = depth(root->leftChild);
int rightDepth = depth(root->rightChild);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
int leafCount(TreeNode* root) {
if (!root) {
return 0;
} else if (!root->leftChild && !root->rightChild) {
return 1;
} else {
return leafCount(root->leftChild) + leafCount(root->rightChild);
}
}
int nodeCount(TreeNode* root) {
if (!root) {
return 0;
} else {
return nodeCount(root->leftChild) + nodeCount(root->rightChild) + 1;
}
}
```
销毁二叉树:
```c++
void destroyBinaryTree(TreeNode*& root) {
if (root) {
destroyBinaryTree(root->leftChild);
destroyBinaryTree(root->rightChild);
delete root;
root = NULL;
}
}
```
完整代码:
```c++
#include <iostream>
using namespace std;
struct TreeNode {
char data;
TreeNode* leftChild;
TreeNode* rightChild;
};
void createBinaryTree(TreeNode*& root) {
char ch;
cin >> ch;
if (ch == '#') {
root = NULL;
} else {
root = new TreeNode;
root->data = ch;
createBinaryTree(root->leftChild);
createBinaryTree(root->rightChild);
}
}
void preOrder(TreeNode* root) {
if (root) {
cout << root->data << " ";
preOrder(root->leftChild);
preOrder(root->rightChild);
}
}
void inOrder(TreeNode* root) {
if (root) {
inOrder(root->leftChild);
cout << root->data << " ";
inOrder(root->rightChild);
}
}
void postOrder(TreeNode* root) {
if (root) {
postOrder(root->leftChild);
postOrder(root->rightChild);
cout << root->data << " ";
}
}
int depth(TreeNode* root) {
if (!root) {
return 0;
} else {
int leftDepth = depth(root->leftChild);
int rightDepth = depth(root->rightChild);
return (leftDepth > rightDepth ? leftDepth : rightDepth) + 1;
}
}
int leafCount(TreeNode* root) {
if (!root) {
return 0;
} else if (!root->leftChild && !root->rightChild) {
return 1;
} else {
return leafCount(root->leftChild) + leafCount(root->rightChild);
}
}
int nodeCount(TreeNode* root) {
if (!root) {
return 0;
} else {
return nodeCount(root->leftChild) + nodeCount(root->rightChild) + 1;
}
}
void destroyBinaryTree(TreeNode*& root) {
if (root) {
destroyBinaryTree(root->leftChild);
destroyBinaryTree(root->rightChild);
delete root;
root = NULL;
}
}
int main() {
TreeNode* root = NULL;
createBinaryTree(root);
cout << "先序遍历:";
preOrder(root);
cout << endl;
cout << "中序遍历:";
inOrder(root);
cout << endl;
cout << "后序遍历:";
postOrder(root);
cout << endl;
cout << "深度:" << depth(root) << endl;
cout << "叶子结点数:" << leafCount(root) << endl;
cout << "结点总数:" << nodeCount(root) << endl;
destroyBinaryTree(root);
return 0;
}
```
### 回答2:
二叉树是由节点及其指针构成的树形结构,每个节点最多有两个子节点,分别称为左子节点和右子节点。二叉链表是一种常见的二叉树的存储方式,其中每个节点都包含三个部分:数据域,左子节点指针和右子节点指针。
(1)使用二叉链表创建二叉树:
首先创建一个节点结构,包含数据域、左子节点指针和右子节点指针。根据二叉树的特性,可以从根节点开始,依次创建左子节点和右子节点,将它们通过指针与父节点连接起来,最终完成整棵二叉树的创建。
(2)对二叉树进行先序、中序、后序遍历:
先序遍历:先访问根节点,然后先序遍历左子树,最后先序遍历右子树。
中序遍历:先中序遍历左子树,然后访问根节点,最后中序遍历右子树。
后序遍历:先后序遍历左子树,然后后序遍历右子树,最后访问根节点。
(3)统计二叉树的深度、叶子节点数、节点总数:
深度:二叉树的深度即为从根节点到最远叶子节点的层数,可以通过递归方式计算,从根节点开始,每次递归时将深度加一,直到到达叶子节点。
叶子节点数:叶子节点即没有子节点的节点,可以通过递归方式计算,从根节点开始,每次递归时判断是否为叶子节点,如果是,则叶子节点数加一。
节点总数:节点总数即为二叉树中所有节点的数量,可以通过递归方式计算,从根节点开始,每次递归时将节点总数加一,然后递归计算左子树和右子树中的节点总数。
(4)销毁二叉树:
销毁二叉树即释放二叉树所占用的内存空间,可以通过递归方式进行销毁,从根节点开始,依次销毁左子树和右子树,最后释放根节点的内存空间。
以上就是使用二叉链表创建二叉树,并完成相应操作的步骤和方法。
### 回答3:
首先我们需要先定义二叉树的节点的数据结构:
```
struct Node {
int data;
Node* left;
Node* right;
};
```
接着,我们可以通过二叉链表来创建一棵二叉树。假设我们有一个数组`arr`,存储了二叉树的元素,其中`arr[i]`为节点`i`的值。
```
Node* createTree(int arr[], int n, int index) {
Node* root = nullptr;
if (index < n) {
root = new Node;
root->data = arr[index];
root->left = createTree(arr, n, 2 * index + 1); // 递归创建左子树
root->right = createTree(arr, n, 2 * index + 2); // 递归创建右子树
}
return root;
}
```
创建完二叉树后,我们可以分别进行先序、中序和后序遍历:
```
void preOrder(Node* root) {
if (root == nullptr) {
return;
}
cout << root->data << " ";
preOrder(root->left);
preOrder(root->right);
}
void inOrder(Node* root) {
if (root == nullptr) {
return;
}
inOrder(root->left);
cout << root->data << " ";
inOrder(root->right);
}
void postOrder(Node* root) {
if (root == nullptr) {
return;
}
postOrder(root->left);
postOrder(root->right);
cout << root->data << " ";
}
```
统计二叉树的深度、叶子节点数和节点总数的方法如下:
```
int getDepth(Node* root) {
if (root == nullptr) {
return 0;
}
int leftDepth = getDepth(root->left);
int rightDepth = getDepth(root->right);
return max(leftDepth, rightDepth) + 1;
}
int getLeafCount(Node* root) {
if (root == nullptr) {
return 0;
}
if (root->left == nullptr && root->right == nullptr) {
return 1;
}
return getLeafCount(root->left) + getLeafCount(root->right);
}
int getNodeCount(Node* root) {
if (root == nullptr) {
return 0;
}
return getNodeCount(root->left) + getNodeCount(root->right) + 1;
}
```
最后,我们需要销毁二叉树,释放内存:
```
void destroyTree(Node* root) {
if (root == nullptr) {
return;
}
destroyTree(root->left);
destroyTree(root->right);
delete root;
}
```
使用以上方法,我们可以对二叉树进行各种操作和统计。
阅读全文