二叉树-节点分析

通过问题了解:

 问题一:

某二叉树中度为2的结点有18个,则该二叉树中有

 

性质1:

二叉树的终端结点(叶子结点)数等于双分支结点数加1. 假设二叉树中终端结点数为n0,单分支结点数为n1,双分支结点数为n2,二叉树中总结点数为n,因为二叉树中所有结点度数均小于或等于2,所以有:n=n0+n1+n2;另一方面,二叉树中所有结点的分支数(即度数)应等于单分支结点数加上两倍的双分支结点数,即n1+2×n2.由树的性质1,有:n=n1+2×n2+1.根据以上两个式子,我们可以得出下面这个等式成立:n0+n1+n2= n1+2×n2+1,所以n0=n2+1.

 设度为0,1和2的节点分别为x,y,z,则二叉树总结点数为S=2z+y+1或S=x+y+z,得z+1=x,即度为2的节点数比叶子节点树少1.

性质2:

2的结点数比叶子结点数少1,18+1=19

 

 

 问题二:

   一颗二叉树共有47个节点,其中有23个度为2的节点。假设根节点在第一层。求改二叉树的深度

 【答案】  

  6

 【解析1】  

  根据二叉树的性质,度为0的结点个数比度为2的结点多一个。所以本题中度为0的结点的个数为24。在二叉树的第k层上,最多有2k-1(k>=1)个结点。所以第一层上最多1个结点,第二层上最多2个结点,第三层上最多4个结点,第四层上最多8个结点,第5层上最多16个结点。前5层的总共结点个数等于31,而本题度为2的结点个数为23,因此第5层上只能有8个度为2的结点,即在第6层上还有16个度为0的结点。

 

 【解析2】

  n0=n2+1.所以n0=24,n2=23,一共47.即不存在度为1的结点,为完全二叉树。深度为k的完全二叉树结点最多有2的k次方-1个结点,故为(2^k)-1<=47,故得到【解析1】的计算方式;计算反向每层节点数应该是48》24》12》6》3》1完成。故结果为6

 

转载于:https://www.cnblogs.com/hwaggLee/p/5310419.html

### PTA平台上二叉树创建题目解析 #### 完全二叉树的概念及其特性 一个二叉树,如果每一层的节点数都达到了最大值,则该二叉树被称为完美二叉树。对于深为D且拥有N个节点二叉树而言,当这些节点对应于相同深下的完美二叉树按照层次顺序排列时,这样的树即被定义为完全二叉树[^1]。 #### 二叉树的构成要素遍历方式 依据二叉树递归性质得知,任何非空状态下的二叉树均由根节点以及左右子树这三大部分组合而成。因此,在任意指定位置处可依次实施三种动作:访问当前节点;处理左侧分支;再转向右侧分支进行相应操作[^2]。 #### 构建二叉树的方法论探讨 为了能够有效地建立起一棵完整的二叉树模型,通常会采用一种称为“基于带空指针信息的先根序列”的策略来进行构建工作。具体来说就是利用一组特定编码规则所形成的字符串表达形式来描述目标对象内部各个组成部分之间的相对关系状况。例如,“8 5 1 0 6 0 2 0 0 3 4 0 0 7 0 0 0”这段字符串就代表了一个具体的实例化过程中的输入参数集合,它最终将会形成如图1(a)所示的数据结构形态;而另一个例子则是“1 2 0 3 0 4 0 0 0”,同样遵循上述原则后得到的结果便是类似于图1(b)那样的图形展示效果[^3]。 #### 实际案例分析——通过先序序列创建并遍历二叉树 考虑这样一个场景定:“1 5 8 0 0 0 6 0 0”。这里给出了一组用于初始化某棵待构造实体所需的基础资料集。根据既定算法逻辑框架指引下完成整个流程之后即可获得预期成果物之一——具有明确拓扑特征属性的一棵树形图表。在此基础上进一步开展诸如前序、中序或是后续等多种不同类型的遍历活动便成为可能了[^4]。 ```python class TreeNode: def __init__(self, value=0, left=None, right=None): self.value = value self.left = left self.right = right def create_binary_tree(preorder_list): if not preorder_list or preorder_list[0] == '0': return None root_value = int(preorder_list.pop(0)) node = TreeNode(root_value) node.left = create_binary_tree(preorder_list) node.right = create_binary_tree(preorder_list) return node preorder_sequence = "1 5 8 0 0 0 6 0 0".split() root_node = create_binary_tree(preorder_sequence) def pre_order_traversal(node): if node is None: return [] result = [node.value] result += pre_order_traversal(node.left) result += pre_order_traversal(node.right) return result print(f"Pre-order traversal of the created binary tree: {pre_order_traversal(root_node)}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值