📜  二叉树中的成对交换叶节点(1)

📅  最后修改于: 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
总结

本文介绍了如何递归和迭代地交换二叉树中的成对叶节点。递归的方式较为简单,但效率稍低;迭代的方式效率更高,但需要使用栈来存储节点,代码较为繁琐。我们可以根据自己的实际情况和喜好,选择适合自己的方式。