【二叉树】Leetcode 222. 完全二叉树的节点个数【简单】

完全二叉树的节点个数

  • 你一棵 完全二叉树 的根节点 root ,求出该树的节点个数。

完全二叉树 的定义如下:在完全二叉树中,除了最底层节点可能没填满外,其余每层节点数都达到最大值,并且最下面一层的节点都集中在该层最左边的若干位置。若最底层为第 h 层,则该层包含 1~ 2h 个节点。

示例 1:
在这里插入图片描述
输入: root = [1,2,3,4,5,6]
输出: 6

解题思路

树的高度:

  • 计算树的高度可以在 O(log n) 时间内完成,通过沿着左子树一直走到底。

完全二叉树的性质

  • 对于完全二叉树,如果左右子树的高度相同,那么左子树一定是满二叉树,可以直接计算其节点数;
  • 如果左右子树的高度不同,那么右子树一定是满二叉树。

递归计算:

  • 根据左右子树的高度关系,递归地计算左右子树的节点数,直到叶节点。

Java实现

public class CountNodes {
   
    public static class TreeNode {
   
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) {
    val = x; }
    }

   
### LeetCode二叉树数据结构题目解决方案 #### 一、遍历类问题 对于二叉树的前序遍历,在访问节点的过程中,先处理根结点,再依次递归地做左子树和右子树的前序遍历[^1]。 ```python def preorderTraversal(root): res = [] def dfs(node): if not node: return res.append(node.val) # 处理当前节点的数据 dfs(node.left) # 左子树递归调用 dfs(node.right) # 右子树递归调用 dfs(root) return res ``` 中序遍历则是按照左子树—>根->右子树这样的顺序来访问各个节点。当遍历到某个节点时,如果该节点为空,则返回;如果不为空则继续向其左侧深入直到遇到叶子节点并输出它的值之后回溯至最近未被处理过的父级节点进行相同操作直至整棵树都被扫描完毕[^2]。 ```python def inorderTraversal(root): result = [] def helper(node): if node is None: return helper(node.left) # 访问左孩子 result.append(node.val)# 输出本层中间位置上的元素即根部所在之处的内容 helper(node.right) # 接着往右边走一步重复上述过程 helper(root) return result ``` 后序遍历指的是先遍历左右两个分支最后才回到自己这里来做相应的事情比如打印出来或者累加求和等动作[^3]。 ```python def postorderTraversal(root): output = [] def traverse(node): if node is None: return traverse(node.left) # 对于每一个非空节点都尝试去探索它左边的部分 traverse(node.right) # 同样也要记得查看右侧是否有值得一看的东西哦~ output.append(node.val) # 把这个数加入我们的答案列表里头咯! traverse(root) return output ``` #### 二、构建与恢复二叉树 给定一棵二叉搜索树(BST),其中每个节点都有唯一的键值,并且满足性质:任意节点的关键字大于等于左子树中的任何关键字而小于等于右子树里的任何一个关键字。那么可以通过已知条件重建这棵特殊的二叉树[^4]。 ```python class TreeNode(object): def __init__(self, val=0, left=None, right=None): self.val = val self.left = left self.right = right def bstFromPreorder(preorder): if not preorder or len(preorder)==0 :return None root_val = preorder.pop(0) tree_node = TreeNode(val=root_val ) i = next((i for i,v in enumerate(preorder)if v >root_val),len(preorder)) tree_node.left=bstFromPreorder(preorder[:i]) tree_node.right=bstFromPreorder(preorder[i:]) return tree_node ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值