编写算法计算二叉树中任意两个结点的公共祖先。其中,输入第一行为二叉树序列,第二行和第三行分别为两个节点数据;输出:两个节点的公共祖先
时间: 2023-06-09 09:08:46 浏览: 143
好的,让我来帮您解决这个问题。可以采用递归法来计算二叉树中任意两个节点的公共祖先。具体步骤如下:
1. 从根节点开始遍历二叉树,如果找到目标节点则返回该节点;如果找到空节点则返回 NULL。
2. 递归左右子树,如果左右子树都返回非空值,则代表目标节点分别在左右子树中,当前节点即为公共祖先;如果只有一个子树返回非空值,则继续递归该子树;如果两个子树都返回空值,则返回 NULL。
以下是代码实现,递归函数接收一个节点指针和两个目标节点的值:
```python
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
def lowestCommonAncestor(root: TreeNode, p: int, q: int) -> TreeNode:
if not root:
return None
if root.val == p or root.val == q:
return root
left = lowestCommonAncestor(root.left, p, q)
right = lowestCommonAncestor(root.right, p, q)
if left and right:
return root
if left:
return left
if right:
return right
return None
```
其中 TreeNode 为二叉树节点的定义,val 表示节点的值,left 和 right 表示左右子树节点。函数 lowestCommonAncestor 返回目标节点的公共祖先,如果不存在则返回 NULL。可以通过创建一个二叉树对象来传递 root 节点参数进行测试。
```
# create binary tree
# 3
# / \
# 5 1
# / \ / \
# 6 2 0 8
# / \
# 7 4
root = TreeNode(3)
root.left = TreeNode(5)
root.right = TreeNode(1)
root.left.left = TreeNode(6)
root.left.right = TreeNode(2)
root.left.right.left = TreeNode(7)
root.left.right.right = TreeNode(4)
root.right.left = TreeNode(0)
root.right.right = TreeNode(8)
# test lowestCommonAncestor
p = 5
q = 1
lca = lowestCommonAncestor(root, p, q)
if lca:
print(lca.val)
else:
print("NULL")
```
输出为 3,即节点 5 和节点 1 的公共祖先是节点 3。
阅读全文