c语言二叉树分支结点个数,输出二叉树中从每个叶子结点到根结点的路径,统计二叉树的度为1的结点个数,二叉树算表达式(C语言)...
时间: 2024-01-23 16:44:33 浏览: 90
1. C语言二叉树分支结点个数
下面是一个简单的二叉树结构体定义:
```
typedef struct TreeNode {
int data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
```
我们可以通过遍历二叉树的方式来统计二叉树的分支结点个数,具体实现可以使用递归或者栈来实现。
递归实现:
```
int countNodes(TreeNode *root) {
if (root == NULL) {
return 0;
}
return countNodes(root->left) + countNodes(root->right) + 1;
}
```
栈实现:
```
int countNodes(TreeNode *root) {
int count = 0;
if (root == NULL) {
return count;
}
stack<TreeNode*> s;
s.push(root);
while (!s.empty()) {
TreeNode *node = s.top();
s.pop();
count++;
if (node->left != NULL) {
s.push(node->left);
}
if (node->right != NULL) {
s.push(node->right);
}
}
return count;
}
```
2. 输出二叉树中从每个叶子结点到根结点的路径
我们可以使用递归的方式来实现这个功能,遍历到叶子结点时输出路径即可。
```
void printPaths(TreeNode *root, int path[], int pathLen) {
if (root == NULL) {
return;
}
path[pathLen] = root->data;
pathLen++;
if (root->left == NULL && root->right == NULL) {
for (int i = pathLen-1; i >= 0; i--) {
printf("%d ", path[i]);
}
printf("\n");
} else {
printPaths(root->left, path, pathLen);
printPaths(root->right, path, pathLen);
}
}
```
3. 统计二叉树的度为1的结点个数
度为1的结点是指只有一个子节点的结点,我们可以使用递归的方式遍历二叉树,每当遇到一个结点只有一个子节点时,就将计数器加一。
```
int countDegreeOneNodes(TreeNode *root) {
if (root == NULL) {
return 0;
}
int count = 0;
if (root->left != NULL && root->right == NULL) {
count++;
} else if (root->left == NULL && root->right != NULL) {
count++;
}
count += countDegreeOneNodes(root->left) + countDegreeOneNodes(root->right);
return count;
}
```
4. 二叉树算表达式(C语言)
我们可以使用递归的方式来实现二叉树算表达式,遍历到叶子节点时返回该节点的值,遍历到非叶子节点时先计算左右子树的值,再根据父节点的运算符进行计算。
```
typedef struct TreeNode {
char op;
int value;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
int eval(TreeNode *root) {
if (root == NULL) {
return 0;
}
if (root->left == NULL && root->right == NULL) {
return root->value;
}
int leftValue = eval(root->left);
int rightValue = eval(root->right);
if (root->op == '+') {
return leftValue + rightValue;
} else if (root->op == '-') {
return leftValue - rightValue;
} else if (root->op == '*') {
return leftValue * rightValue;
} else if (root->op == '/') {
return leftValue / rightValue;
}
return 0;
}
```
阅读全文