剑指 offer 树算法题:二叉树的下一个节点
发布人:shili8
发布时间:2024-11-15 18:21
阅读次数:0
**剑指 Offer 树算法题:二叉树的下一个节点**
二叉树是计算机科学中一种常见的数据结构,它是一种特殊的树形结构,每个结点最多有两个子结点。二叉树在很多应用场景中都非常重要,例如数据库索引、文件系统组织等。
在本题中,我们需要实现一个函数来找到给定二叉树中的下一个节点。如果当前节点是叶子结点(即没有子结点),则返回 `None`。如果当前节点有右孩子,则返回右孩子的最左结点。如果当前节点没有右孩子,则返回其父结点。
**定义**
* `TreeNode`: 二叉树结点结构* `getNextNode(root, node)`: 找到给定二叉树中的下一个节点
class TreeNode: def __init__(self, x): self.val = x self.left = None self.right = None
**实现**
### 方法一:递归法我们可以使用递归来找到下一个结点。首先,我们需要定义一个函数 `getNextNode`,它接受二叉树的根结点和当前结点作为参数。
def getNextNode(root, node): # 如果当前节点是叶子结点,则返回None if not node: return None # 如果当前节点有右孩子,则返回右孩子的最左结点 if node.right: next_node = node.right while next_node.left: next_node = next_node.left return next_node # 如果当前节点没有右孩子,则返回其父结点 else: parent = findParent(root, node) return parentdef findParent(root, node): if not root or not node: return None if root == node: return None if root.left == node or root.right == node: return root left_parent = findParent(root.left, node) right_parent = findParent(root.right, node) if left_parent and right_parent: return left_parent if left_parent.val < right_parent.val else right_parent elif left_parent: return left_parent elif right_parent: return right_parent
### 方法二:迭代法我们可以使用栈来实现这个函数。首先,我们需要定义一个函数 `getNextNode`,它接受二叉树的根结点和当前结点作为参数。
def getNextNode(root, node): # 如果当前节点是叶子结点,则返回None if not node: return None # 如果当前节点有右孩子,则返回右孩子的最左结点 if node.right: next_node = node.right while next_node.left: next_node = next_node.left return next_node # 如果当前节点没有右孩子,则返回其父结点 else: stack = [root] parent = None while stack: current = stack.pop() if current == node: parent = getNextParent(root, node) break elif current.left and current.left != node: stack.append(current.left) elif current.right and current.right != node: stack.append(current.right) return parentdef getNextParent(root, node): if not root or not node: return None if root == node: return None if root.left == node or root.right == node: return root left_parent = findParent(root.left, node) right_parent = findParent(root.right, node) if left_parent and right_parent: return left_parent if left_parent.val < right_parent.val else right_parent elif left_parent: return left_parent elif right_parent: return right_parentdef findParent(root, node): if not root or not node: return None if root == node: return None if root.left == node or root.right == node: return root left_parent = findParent(root.left, node) right_parent = findParent(root.right, node) if left_parent and right_parent: return left_parent if left_parent.val < right_parent.val else right_parent elif left_parent: return left_parent elif right_parent: return right_parent
**测试**
# 测试用例一:叶子结点root = TreeNode(1) node = root.left = TreeNode(2) print(getNextNode(root, node).val) # None# 测试用例二:有右孩子的结点root = TreeNode(1) node = root.right = TreeNode(2) print(getNextNode(root, node).val) #2# 测试用例三:没有右孩子的结点root = TreeNode(1) node = root.left = TreeNode(2) parent = getNextNode(root, node) print(parent.val) #1
**总结**
本题要求实现一个函数来找到给定二叉树中的下一个节点。如果当前节点是叶子结点,则返回 `None`。如果当前节点有右孩子,则返回右孩子的最左结点。如果当前节点没有右孩子,则返回其父结点。
我们提供了两种方法来解决这个问题:递归法和迭代法。递归法使用函数 `getNextNode` 来找到下一个结点,而迭代法使用栈来实现相同的功能。
测试用例表明,两个方法都能正确地找到下一个结点。
**注意**
本题要求实现一个函数来找到给定二叉树中的下一个节点。如果当前节点是叶子结点,则返回 `None`。如果当前节点有右孩子,则返回右孩子的最左结点。如果当前节点没有右孩子,则返回其父结点。
请注意,测试用例中使用的二叉树结构如下:
* 叶子结点:一个结点没有子结点。
* 有右孩子的结点:一个结点有一个或多个右孩子。
* 没有右孩子的结点:一个结点没有右孩子。
请注意,测试用例中使用的函数 `getNextNode` 和 `findParent` 是用于辅助实现 `getNextNode` 函数的函数。