用C++设计求一棵二叉树中结点总数的算法并实现。
时间: 2023-06-03 16:02:20 浏览: 130
好的,这个问题是计算二叉树中节点总数的算法,涉及C语言编程。可以通过递归实现,具体代码如下:
```c
struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
};
int countNodes(struct TreeNode* root){
if(root == NULL) return 0;
return countNodes(root->left) + countNodes(root->right) + 1;
}
```
该函数的功能是计算二叉树中节点总数,入口参数为该树的根节点。函数利用递归的思想,先判断根节点是否为空,如果为空,返回0;否则计算左右子树的节点总数之和再加上根节点,返回该结果。
相关问题
用C++按先序次序输入二叉树中结点的值,构造一棵二叉链表表示的二叉树;实现该二叉树的后序遍历、求该二叉树的结点个数。
好的,这是一道关于二叉树的算法问题。我可以为您提供这方面的帮助。
首先,您可以使用 C 语言中的结构体来表示二叉树节点,例如:
```
struct TreeNode {
int value;
struct TreeNode* left;
struct TreeNode* right;
};
```
接下来,按照先序次序输入二叉树中节点的值,并构造一棵二叉链表表示的二叉树,可以使用递归来实现:
```
struct TreeNode* createTree() {
int value;
scanf("%d", &value);
if (value == -1) { // -1 表示空节点
return NULL;
}
struct TreeNode* node = (struct TreeNode*)malloc(sizeof(struct TreeNode));
node->value = value;
node->left = createTree();
node->right = createTree();
return node;
}
```
构造完毕后,您可以实现二叉树的后序遍历,也可以使用递归来实现:
```
void postOrderTraverse(struct TreeNode* root) {
if (root == NULL) {
return;
}
postOrderTraverse(root->left);
postOrderTraverse(root->right);
printf("%d ", root->value);
}
```
最后,您可以实现计算该二叉树的节点个数,同样可以使用递归来实现:
```
int countNodes(struct TreeNode* root) {
if (root == NULL) {
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);
}
```
希望这些代码能够帮助您解决问题。
c++设计算法求二叉树的结点个数,深度,并按前序次序打印二叉树中的叶子结点,并求树中结点x的第i个孩子
以下是C++代码实现:
```
#include <iostream>
using namespace std;
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(NULL), right(NULL) {}
};
// 获取二叉树的结点个数
int getNodeNum(TreeNode* root) {
if (root == NULL) {
return 0;
}
return 1 + getNodeNum(root->left) + getNodeNum(root->right);
}
// 获取二叉树的深度
int getDepth(TreeNode* root) {
if (root == NULL) {
return 0;
}
return 1 + max(getDepth(root->left), getDepth(root->right));
}
// 按前序次序打印二叉树中的叶子节点
void printLeaves(TreeNode* root) {
if (root == NULL) {
return;
}
if (root->left == NULL && root->right == NULL) {
cout << root->val << " ";
return;
}
printLeaves(root->left);
printLeaves(root->right);
}
// 获取结点x的第i个孩子
TreeNode* getChildNode(TreeNode* root, int x, int i) {
if (root == NULL) {
return NULL;
}
if (root->val == x) {
if (i == 1) {
return root->left;
} else {
return root->right;
}
}
TreeNode* leftNode = getChildNode(root->left, x, i);
if (leftNode != NULL) {
return leftNode;
}
TreeNode* rightNode = getChildNode(root->right, x, i);
if (rightNode != NULL) {
return rightNode;
}
return NULL;
}
int main() {
// 构造二叉树
TreeNode* root = new TreeNode(1);
root->left = new TreeNode(2);
root->right = new TreeNode(3);
root->left->left = new TreeNode(4);
root->left->right = new TreeNode(5);
root->right->left = new TreeNode(6);
root->right->right = new TreeNode(7);
// 获取二叉树的结点个数
cout << "node num: " << getNodeNum(root) << endl;
// 获取二叉树的深度
cout << "depth: " << getDepth(root) << endl;
// 按前序次序打印二叉树中的叶子节点
cout << "leaves: ";
printLeaves(root);
cout << endl;
// 获取结点x的第i个孩子
TreeNode* child = getChildNode(root, 2, 2);
if (child == NULL) {
cout << "no node found" << endl;
} else {
cout << "child node: " << child->val << endl;
}
return 0;
}
```
输出结果为:
```
node num: 7
depth: 3
leaves: 4 5 6 7
child node: 5
```
其中,`getNodeNum`函数用于获取二叉树的结点个数,采用递归实现。`getDepth`函数用于获取二叉树的深度,同样采用递归实现。`printLeaves`函数用于按前序次序打印二叉树中的叶子节点,同样采用递归实现。`getChildNode`函数用于获取结点x的第i个孩子,采用递归实现。主函数中构造了一个二叉树,然后分别调用这些函数进行测试。
阅读全文