📅  最后修改于: 2023-12-03 15:21:39.986000             🧑  作者: Mango
在二叉树中,我们有时需要交换某些叶子节点的位置。本文将详细介绍如何通过递归和迭代的方式,在二叉树中交换成对的叶节点。
给定一个二叉树,交换所有成对的叶子节点的值。如果有一个单独的叶子节点,则不进行交换。
例如,给定以下二叉树:
1
/ \
2 3
/ \ / \
4 5 6 7
交换所有成对的叶子节点后得到:
1
/ \
3 2
/ \ / \
4 7 6 5
我们可以使用递归或迭代的方式交换叶节点。下面将分别介绍这两种方式。
我们可以使用递归方式来解决这个问题。首先,我们需要定义一个递归函数。这个函数会接收一个二叉树节点,然后返回它的子树中的所有叶子节点。
def getLeaves(node):
if not node:
return []
if not node.left and not node.right:
return [node]
return getLeaves(node.left) + getLeaves(node.right)
接下来,我们定义一个交换叶节点的函数,它将递归地交换每对叶子节点的值。如果给定节点为叶子节点,则直接返回,否则递归交换它的子节点。
def swapLeaves(node):
if not node:
return
# 递归交换左右子节点
swapLeaves(node.left)
swapLeaves(node.right)
# 交换左右叶节点的值
if node.left and node.right and not node.left.left and not node.left.right and not node.right.left and not node.right.right:
node.left.val, node.right.val = node.right.val, node.left.val
最后,我们定义一个包装函数来调用递归函数,同时返回交换后的根节点。
def swapPairs(root):
swapLeaves(root)
return root
我们可以使用迭代方式来解决这个问题。我们可以使用栈来存储一对叶节点。首先,我们将根节点入栈。接下来,我们循环遍历栈,直到栈为空。
在循环的过程中,每次从栈中弹出一对叶节点,并将它们的值交换。如果这个节点不是叶节点,则将它的子节点入栈。我们需要注意的是,我们只能交换成对的叶节点。如果只有一个单独的叶节点,不进行交换。
def swapPairs(root):
stack = [root]
while stack:
node1 = stack.pop()
if not stack:
break
node2 = stack.pop()
if node1.left and node1.right and node2.left and node2.right:
stack.append(node1.left)
stack.append(node2.right)
stack.append(node1.right)
stack.append(node2.left)
elif not node1.left and not node1.right and not node2.left and not node2.right:
node1.val, node2.val = node2.val, node1.val
else:
stack.append(node2)
stack.append(node1)
return root
本文介绍了如何递归和迭代地交换二叉树中的成对叶节点。递归的方式较为简单,但效率稍低;迭代的方式效率更高,但需要使用栈来存储节点,代码较为繁琐。我们可以根据自己的实际情况和喜好,选择适合自己的方式。