二叉树练习

这篇博客讨论了如何利用动态规划和递归方法解决计算不同形态的二叉搜索树的问题。在给定节点数n的情况下,通过计算中间节点的组合来得出所有可能的树结构总数。示例展示了对于n=3的情况,计算得到共有5种不同的二叉搜索树。代码实现中,使用动态规划数组dp,并通过双重循环计算每个节点作为根节点时的树的种类数。

96. 不同的二叉搜索树

难度中等1234

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1 到 n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

输入:n = 3
输出:5

示例 2:

输入:n = 1
输出:1
123456,以3为根节点,左边有2种,右边有3种,总的为2*3
class Solution:
    def numTrees(self, n: int) -> int:

        dp=[0]*(n+1)
        dp[0]=1
        dp[1]=1

        for i in range(2,n+1):
            for j in range(0,n):
                dp[i]+=dp[j]*dp[i-j-1]
        return dp[-1]

 

### 关于线索二叉树练习题 #### 中序线索二叉树的特点 中序线索二叉树通过在每个节点增加两个指针域 `ltag` 和 `rtag` 来实现,分别表示该节点是否有前驱和后继。如果某个节点有左孩子,则它的 `lchild` 指向左孩子;如果没有左孩子,则指向其前驱节点。同样地,如果有右孩子,则 `rchild` 指向右孩子;如果没有右孩子,则指向其后继节点[^2]。 #### 寻找特定节点的前驱与后继 在一个中序线索二叉树中,对于任意节点 X 的前驱可以通过以下方式找到: - 如果节点 X 存在左子树,则前驱为左子树中的最右侧节点(即沿着左子树一直往右走直到无法再继续)。 - 若不存在左子树,则前驱为其父节点链上的最近祖先节点,且该祖先节点的右子树包含当前节点[^5]。 #### 构造一棵二叉树并对其进行线索化处理 假设已知某棵二叉树的先序遍历序列 `[A, B, D, E, C, F]` 及其中序遍历序列 `[D, B, E, A, C, F]`,则可以根据这些信息重建原始二叉树,并进一步将其转化为中序线索二叉树[^4]。 以下是基于 Python 实现的一个简单例子来展示如何构建这样的二叉树以及完成中序线索化的操作: ```python class TreeNode: def __init__(self, val=0, lchild=None, rchild=None, ltag=False, rtag=False): self.val = val self.lchild = lchild self.rchild = rchild self.ltag = ltag self.rtag = rtag def build_tree(preorder, inorder): if not preorder or not inorder: return None root_val = preorder[0] root_index_in_inorder = inorder.index(root_val) left_inorder = inorder[:root_index_in_inorder] right_inorder = inorder[root_index_in_inorder + 1:] left_preorder = preorder[1:len(left_inorder)+1] right_preorder = preorder[len(left_inorder)+1:] node = TreeNode(val=root_val) node.lchild = build_tree(left_preorder, left_inorder) node.rchild = build_tree(right_preorder, right_inorder) return node def threaded_binary_tree(root): pre_node = None def thread(node): nonlocal pre_node if not node: return thread(node.lchild) if not node.lchild: node.lchild = pre_node node.ltag = True if pre_node and not pre_node.rchild: pre_node.rchild = node pre_node.rtag = True pre_node = node thread(node.rchild) thread(root) # Example Usage preorder = ['A', 'B', 'D', 'E', 'C', 'F'] inorder = ['D', 'B', 'E', 'A', 'C', 'F'] tree_root = build_tree(preorder, inorder) threaded_binary_tree(tree_root) ``` 上述代码展示了如何利用给定的先序和中序遍历来创建一颗完整的二叉树,并对该二叉树执行中序线索化过程。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值