给定一棵用二叉链表表示的二叉树,其根指针为 root,试写出求二叉树结点的数的算法。
时间: 2023-06-09 17:08:33 浏览: 172
可以使用递归的方式进行遍历二叉树,每次遍历到一个结点就将其值累加,最终得到二叉树结点的数。
具体算法实现如下:
int countNodes(TreeNode* root) {
if(root == NULL) {//空树的情况
return 0;
}
return 1 + countNodes(root->left) + countNodes(root->right);//递归遍历左右子树,并累加结点数
}
其中,TreeNode 是表示二叉树结点的结构体,包含左右子树指针和结点值等信息。
相关问题
c/c++数据结构:编写一算法,给定一棵二叉树,用二叉链表表示,其根指针为t,试写出求该二叉树中结点e的双亲结点的算法。若没有结点e或者该结点没有双亲结点,分别输出相应的信息;若结点e有双亲,输出其双亲的值。
好的,您的问题是如何编写一个二叉树查找算法,找到某个节点的父节点。这个算法可以通过遍历这棵树来实现。接下来是我的 C++ 代码实现:
```
// 定义二叉树节点结构体
struct TreeNode {
int val;
TreeNode* left;
TreeNode* right;
TreeNode(int x) : val(x), left(nullptr), right(nullptr) { }
};
// 定义查找父节点的函数
TreeNode* findParent(TreeNode* root, int value) {
if (!root) { // 判断根节点是否为空
return nullptr;
}
if (root->left && root->left->val == value || root->right && root->right->val == value) { // 判断节点是否为左子节点或右子节点
return root;
}
TreeNode* leftNode = findParent(root->left, value);
TreeNode* rightNode = findParent(root->right, value);
return leftNode ? leftNode : rightNode; // 返回左右子树中,先被遍历到的节点(即父节点)
}
```
此函数的时间复杂度为 O(n),其中 n 是二叉树中节点的个数。当节点 e 没有父节点时,函数将返回 nullptr;当节点 e 不存在时,函数将返回相应的信息。感谢您的提问!
二叉树的带权路径长度(WPL)是二叉树中所有叶结点的带权路径长度之和。给定一棵二叉树T, 采用二叉链表存储,结点结构为:left weight right,其中叶结点的weight域保存该结点的非负权值。设root为指向T的根结点的指针,请设计求T的WPL的算法
可以采用递归的方式来求解二叉树的带权路径长度(WPL)。具体步骤如下:
1. 如果当前结点为叶子结点,则返回该结点的权值。
2. 否则,分别递归计算左子树和右子树的WPL,并将它们的和加上当前结点的权值作为当前子树的WPL。
3. 最终,递归返回根结点的WPL作为整棵二叉树的WPL。
下面是该算法的实现代码:
```python
def calc_wpl(root):
if root is None:
return 0
if root.left is None and root.right is None:
return root.weight
left_wpl = calc_wpl(root.left)
right_wpl = calc_wpl(root.right)
return left_wpl + right_wpl + root.weight
```
其中,root.left和root.right分别表示左子树和右子树的根结点,root.weight表示当前结点的权值。
阅读全文