统计利用先序遍历创建的二叉树的宽度,告诉我用层次遍历二叉树的方法求宽度的代码
时间: 2023-11-29 14:05:48 浏览: 55
算法:
层次遍历二叉树可以记录每一层的节点数,再找出最大值即为二叉树的宽度。
代码实现:
```python
def find_width(root):
if not root:
return 0
queue = [root]
max_width = 1
while queue:
cur_level = []
for i in range(len(queue)):
node = queue.pop(0)
cur_level.append(node)
if node.left:
queue.append(node.left)
if node.right:
queue.append(node.right)
max_width = max(max_width, len(cur_level))
return max_width
```
笑话:为什么数学老师是个很好的植物学家? 因为他总是讲枝条。
相关问题
用C语言创建一个字符型二叉树,计算二叉树叶子节点数和总节点数,实现先序遍历,中序遍历,后序遍历,以及层次遍历,计算二叉树的高度和宽度
好的,下面是C语言实现的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct node {
char data;
struct node* left;
struct node* right;
} Node;
// 创建二叉树
Node* createTree() {
char ch;
Node* root = NULL;
scanf("%c", &ch);
if (ch == '#') {
root = NULL;
} else {
root = (Node*)malloc(sizeof(Node));
if (root == NULL) {
printf("内存分配失败!\n");
exit(1);
}
root->data = ch;
root->left = createTree();
root->right = createTree();
}
return root;
}
// 计算二叉树叶子节点数和总节点数
void countNodes(Node* root, int* count, int* leafCount) {
if (root != NULL) {
(*count)++;
if (root->left == NULL && root->right == NULL) {
(*leafCount)++;
}
countNodes(root->left, count, leafCount);
countNodes(root->right, count, leafCount);
}
}
// 先序遍历二叉树
void preOrder(Node* root) {
if (root != NULL) {
printf("%c ", root->data);
preOrder(root->left);
preOrder(root->right);
}
}
// 中序遍历二叉树
void inOrder(Node* root) {
if (root != NULL) {
inOrder(root->left);
printf("%c ", root->data);
inOrder(root->right);
}
}
// 后序遍历二叉树
void postOrder(Node* root) {
if (root != NULL) {
postOrder(root->left);
postOrder(root->right);
printf("%c ", root->data);
}
}
// 层次遍历二叉树
void levelOrder(Node* root) {
Node* queue[1000];
int front = 0, rear = 0;
queue[rear++] = root;
while (front < rear) {
Node* node = queue[front++];
printf("%c ", node->data);
if (node->left != NULL) {
queue[rear++] = node->left;
}
if (node->right != NULL) {
queue[rear++] = node->right;
}
}
}
// 计算二叉树的高度
int height(Node* root) {
if (root == NULL) {
return 0;
}
int leftHeight = height(root->left);
int rightHeight = height(root->right);
return (leftHeight > rightHeight ? leftHeight : rightHeight) + 1;
}
// 计算二叉树的宽度
int width(Node* root) {
if (root == NULL) {
return 0;
}
Node* queue[1000];
int front = 0, rear = 0, maxWidth = 0;
queue[rear++] = root;
while (front < rear) {
int count = rear - front;
if (count > maxWidth) {
maxWidth = count;
}
while (count-- > 0) {
Node* node = queue[front++];
if (node->left != NULL) {
queue[rear++] = node->left;
}
if (node->right != NULL) {
queue[rear++] = node->right;
}
}
}
return maxWidth;
}
int main() {
printf("请输入二叉树,使用'#'表示空节点:\n");
Node* root = createTree();
int count = 0, leafCount = 0;
countNodes(root, &count, &leafCount);
printf("二叉树总节点数:%d,叶子节点数:%d\n", count, leafCount);
printf("先序遍历结果:");
preOrder(root);
printf("\n");
printf("中序遍历结果:");
inOrder(root);
printf("\n");
printf("后序遍历结果:");
postOrder(root);
printf("\n");
printf("层次遍历结果:");
levelOrder(root);
printf("\n");
printf("二叉树的高度:%d\n", height(root));
printf("二叉树的宽度:%d\n", width(root));
return 0;
}
```
其中,输入二叉树的方式为从标准输入中读取字符,使用 # 表示空节点。在计算节点数和叶子节点数时,使用了指针传参的方式。在计算二叉树高度和宽度时,使用了队列来实现层次遍历。
使用C++,根据二叉树的先序遍历序列建立二叉树,完善代码函数tree.CreateBinaryTree(); 例如:根据先序遍历序列ABDG#L##HM###EIN##O###C#FJ##K##建立二叉树,其中,#表示空树。
要实现 `CreateBinaryTree` 函数,可以根据给定的先序遍历序列构建二叉树。以下是该函数的实现:
```cpp
#include <iostream>
#include <queue>
using namespace std;
// 假设 BTNode 是一个定义好的二叉树节点类
template <class T>
class BTNode {
public:
T data;
BTNode<T> *left, *right;
BTNode(T d = T(), BTNode<T> *l = nullptr, BTNode<T> *r = nullptr) : data(d), left(l), right(r) {}
};
// 假设 BinaryTree 是一个定义好的二叉树类
template <class T>
class BinaryTree {
private:
BTNode<T> *root;
public:
BinaryTree() : root(nullptr) {}
~BinaryTree() { Destroy(root); }
void CreateBinaryTree();
void PreOrder(void (*visit)(const T&)) const;
void InOrder(void (*visit)(const T&)) const;
void PostOrder(void (*visit)(const T&)) const;
void LevelOrder(void (*visit)(const T&)) const;
int Width() const;
int NodeCount() const;
private:
void Destroy(BTNode<T> *&node);
void PreOrder(BTNode<T> *node, void (*visit)(const T&)) const;
void InOrder(BTNode<T> *node, void (*visit)(const T&)) const;
void PostOrder(BTNode<T> *node, void (*visit)(const T&)) const;
int Width(BTNode<T> *node) const;
int NodeCount(BTNode<T> *node) const;
};
template <class T>
void BinaryTree<T>::CreateBinaryTree() {
queue<BTNode<T>*> q;
char ch;
cin >> ch;
if (ch == '#') {
root = nullptr;
} else {
root = new BTNode<T>(ch);
q.push(root);
}
while (!q.empty()) {
BTNode<T> *p = q.front();
q.pop();
cin >> ch;
if (ch != '#') {
p->left = new BTNode<T>(ch);
q.push(p->left);
}
cin >> ch;
if (ch != '#') {
p->right = new BTNode<T>(ch);
q.push(p->right);
}
}
}
template <class T>
void BinaryTree<T>::PreOrder(void (*visit)(const T&)) const {
PreOrder(root, visit);
}
template <class T>
void BinaryTree<T>::InOrder(void (*visit)(const T&)) const {
InOrder(root, visit);
}
template <class T>
void BinaryTree<T>::PostOrder(void (*visit)(const T&)) const {
PostOrder(root, visit);
}
template <class T>
void BinaryTree<T>::LevelOrder(void (*visit)(const T&)) const {
if (root == nullptr) return;
queue<BTNode<T>*> q;
q.push(root);
while (!q.empty()) {
BTNode<T> *p = q.front();
q.pop();
visit(p->data);
if (p->left) q.push(p->left);
if (p->right) q.push(p->right);
}
}
template <class T>
int BinaryTree<T>::Width() const {
return Width(root);
}
template <class T>
int BinaryTree<T>::NodeCount() const {
return NodeCount(root);
}
template <class T>
void BinaryTree<T>::Destroy(BTNode<T> *&node) {
if (node) {
Destroy(node->left);
Destroy(node->right);
delete node;
node = nullptr;
}
}
template <class T>
void BinaryTree<T>::PreOrder(BTNode<T> *node, void (*visit)(const T&)) const {
if (node) {
visit(node->data);
PreOrder(node->left, visit);
PreOrder(node->right, visit);
}
}
template <class T>
void BinaryTree<T>::InOrder(BTNode<T> *node, void (*visit)(const T&)) const {
if (node) {
InOrder(node->left, visit);
visit(node->data);
InOrder(node->right, visit);
}
}
template <class T>
void BinaryTree<T>::PostOrder(BTNode<T> *node, void (*visit)(const T&)) const {
if (node) {
PostOrder(node->left, visit);
PostOrder(node->right, visit);
visit(node->data);
}
}
template <class T>
int BinaryTree<T>::Width(BTNode<T> *node) const {
if (node == nullptr) return 0;
int maxWidth = 0, thisLevel = 1, nextLevel = 0;
queue<BTNode<T>*> q;
q.push(node);
while (!q.empty()) {
BTNode<T> *p = q.front();
q.pop();
thisLevel--;
if (p->left) {
q.push(p->left);
nextLevel++;
}
if (p->right) {
q.push(p->right);
nextLevel++;
}
if (thisLevel == 0) {
if (nextLevel > maxWidth) maxWidth = nextLevel;
thisLevel = nextLevel;
nextLevel = 0;
}
}
return maxWidth;
}
template <class T>
int BinaryTree<T>::NodeCount(BTNode<T> *node) const {
if (node == nullptr) return 0;
return 1 + NodeCount(node->left) + NodeCount(node->right);
}
```
### 解释
1. **CreateBinaryTree**:
- 使用队列来辅助层次遍历。
- 按照先序遍历的顺序读取字符,遇到 '#' 表示空节点。
- 构建根节点并将其加入队列。
- 依次处理队列中的节点,为其创建左右子节点,并将非空子节点加入队列。
2. **其他方法**:
- `PreOrder`, `InOrder`, `PostOrder`, 和 `LevelOrder` 分别实现了前序、中序、后序和层序遍历。
- `Width` 计算二叉树的最大宽度。
- `NodeCount` 计算二叉树的节点数。
- `Destroy` 用于销毁二叉树,释放内存。
这样,你可以根据给定的先序遍历序列构建二叉树,并进行各种遍历操作和其他计算。
阅读全文