【解题思路】1-6存在一棵总共有2016个结点的二叉树,其中有16个结点只有一个孩(2分)

【题目】

1-6 存在一棵总共有2016个结点的二叉树,其中有16个结点只有一个孩子。(2分)

T

F

答案  F

作者  何钦铭

单位  浙江大学

【思路】

首先,二叉树总共有2016个结点,满二叉树总共的结点数为2的n次方-1,n是满二叉树的层数,所以该二叉树满的情况下是2048-1=2047,而2047-2016=31,也就是说,少了31个叶子结点,题目中16个结点只有一个孩子,那就先从16个叶节点上一层的父节点分别拿一个孩子,于是还剩15个结点未处理,15个除以2有余数,那就是多的一个要么导致剩17个只有一个孩子,要么15个只有一个孩子,不可能出现16个只有一个结点的孩子

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
我们可以通过扩展后序遍历序列来还原二叉树,然后进行深度优先搜索,统计目标结点的子孙结点个数。 具体步骤如下: 1. 根据扩展后序遍历序列还原二叉树。我们可以使用一个栈来记录当前未处理的结点,具体的还原方法可以参考这篇文章:[如何根据扩展后序遍历还原二叉树](https://www.cnblogs.com/TenosDoIt/p/3661694.html)。 2. 进行深度优先搜索。从根结点开始,递归地遍历左右子树,统计目标结点的子孙结点个数。如果当前结点是目标结点,那么直接返回它的子孙结点个数;否则,返回左右子树中目标结点的子孙结点个数之和加上当前结点自身。 下面是实现代码: ```cpp #include <iostream> #include <vector> #include <stack> using namespace std; struct TreeNode { int val; TreeNode* left; TreeNode* right; TreeNode(int x) : val(x), left(NULL), right(NULL) {} }; // 根据扩展后序遍历序列还原二叉树 TreeNode* buildTree(vector<int>& postorder) { if (postorder.empty()) { return NULL; } stack<TreeNode*> stk; int n = postorder.size(); for (int i = 0; i < n; i++) { TreeNode* cur = new TreeNode(postorder[i]); if (cur->val < 0) { cur->right = stk.top(); stk.pop(); cur->left = stk.top(); stk.pop(); } stk.push(cur); } return stk.top(); } // 深度优先搜索统计子孙结点个数 int countDescendants(TreeNode* root, int target) { if (root == NULL) { return 0; } if (root->val == target) { // 如果当前结点是目标结点,直接返回它的子孙结点个数 int leftDescendants = root->left ? countDescendants(root->left, target) + 1 : 1; int rightDescendants = root->right ? countDescendants(root->right, target) + 1 : 1; return leftDescendants + rightDescendants - 1; } else { // 否则,返回左右子树中目标结点的子孙结点个数之和加上当前结点自身 return countDescendants(root->left, target) + countDescendants(root->right, target); } } int main() { vector<int> postorder = { 2, 3, 1, -1, -1, 4, 5, -1, -1, 6, -1, -1, 7, -1, -1 }; TreeNode* root = buildTree(postorder); int target = 1; int ans = countDescendants(root, target); cout << "The number of descendants of " << target << " is " << ans << endl; return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码上游

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值