鱼C论坛

 找回密码
 立即注册
查看: 128|回复: 3

二叉排序树遍历算法怎么理解

[复制链接]
发表于 2024-10-10 20:28:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
# Definition for a binary tree node.
# class TreeNode(object):
#     def __init__(self, x):
#         self.val = x
#         self.left = None
#         self.right = None

class Solution(object):
    def increasingBST(self, root):
        self.res = []
        self.inOrder(root)
        if not self.res:
            return 
        dummy = TreeNode(-1)
        cur = dummy
        for node in self.res:
            node.left = node.right = None
            cur.right = node
            cur = cur.right
        return dummy.right
    
    def inOrder(self, root):
        if not root:
            return
        self.inOrder(root.left)
        self.res.append(root)
        self.inOrder(root.right)
如上,要按中序遍历 将其重新排列为一棵递增顺序搜索树,使树中最左边的节点成为树的根节点,并且每个节点没有左子节点,只有一个右子节点,算法如上。
其中这行代码不理解,
for node in self.res:
            node.left = node.right = None
            cur.right = node
            cur = cur.right
        return dummy.right
self.res中的序列不是整型吗?为什么会有左孩子和右孩子,还有哑变量dummy的类型也是一个根节点吗,也有左孩子右孩子
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-10-10 20:28:54 | 显示全部楼层
在你给出的代码中,`self.res` 用于存储中序遍历结果,不是整型值的列表,而是 `TreeNode` 对象的列表。这些对象代表了二叉树中的节点,仍然拥有左右子节点的属性(即 `left` 和 `right` 属性)。以下是对你提到的代码的详细解释:

1. **中序遍历**:
   - 中序遍历 (`inOrder`) 按照左-根-右的顺序访问二叉搜索树(BST),并将访问的节点存储在列表 `self.res` 中。这保证了 `self.res` 中的节点是按值递增排列的。

2. **重新组织树**:
   - `dummy` 是一个辅助节点(哑变量),用来简化重新连接节点的过程。初始时,`dummy` 只有 `right` 属性会被使用,初始值设为 `-1`。
   - 循环 `for node in self.res:` 遍历 `self.res` 中的每一个节点,将它们构建为一个只有右子节点的链表形式,即所谓的递增排序树。
     - `node.left = node.right = None`: 将每个节点的左右子节点都设置为 `None`,这样每个节点就只有一个右子节点了。
     - `cur.right = node`: 将当前节点的右子节点指向列表中的下一个节点,这一步连成链表。
     - `cur = cur.right`: 将 `cur` 向后移动到刚添加的节点上,以准备连接下一个节点。

3. **返回结果**:
   - `return dummy.right`: 返回 `dummy` 的下一个节点,也就是构建好的新的递增顺序搜索树的根节点。

这个过程遵循了中序遍历的自然特性:在二叉搜索树中,中序遍历访问节点的顺序是从小到大的。通过重塑树的结构,我们得到了一个没有左子节点的链表形式的树。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-10-10 20:57:07 | 显示全部楼层
FishC 发表于 2024-10-10 20:28
在你给出的代码中,`self.res` 用于存储中序遍历结果,不是整型值的列表,而是 `TreeNode` 对象的列表。这 ...
if not self.res:
            return
这行代码有何含义
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-10-10 21:12:30 | 显示全部楼层
Terence888 发表于 2024-10-10 20:57
if not self.res:
            return
这行代码有何 ...


这行代码的作用是进行一个简单的检查,确保 `self.res` 列表中有元素。如果 `self.res` 是空的,表示中序遍历没有收集到任何节点,那么就直接返回 `None`,意味着树是空的或遍历没有结果。

这在某些情况下是有用的,例如如果函数被传入的 `root` 是 `None`(即一棵空树),那么 `self.res` 在中序遍历后仍然是空的,这个检查可以避免后续处理无效数据或抛出错误。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 13:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表