编写算法交换二叉树中所有结点的左右子数
时间: 2023-05-31 08:19:13 浏览: 135
### 回答1:
可以使用递归的方式来交换二叉树中所有节点的左右子树。
具体实现步骤如下:
1. 如果当前节点为空,直接返回。
2. 交换当前节点的左右子树。
3. 递归交换当前节点的左子树。
4. 递归交换当前节点的右子树。
代码实现如下:
```
void swap(TreeNode* root) {
if (root == nullptr) {
return;
}
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
swap(root->left);
swap(root->right);
}
```
其中,TreeNode是二叉树节点的结构体,包含左右子树指针和节点值等信息。
### 回答2:
交换二叉树中所有结点的左右子树,实际上就是遍历二叉树,交换每个节点的左右子树。这个过程可以通过递归算法实现。
具体的实现步骤如下:
1. 首先需要判断当前节点是否为空,如果为空则直接返回。
2. 然后交换当前节点的左右子树。
3. 分别递归处理当前节点的左右子节点,对于左子节点调用函数本身,对于右子节点同样如此。
4. 遍历完整棵树后,返回交换后的二叉树。
下面是一份Python代码实现:
```python
# 定义二叉树结构体
class TreeNode:
def __init__(self, val=0, left=None, right=None):
self.val = val
self.left = left
self.right = right
# 交换二叉树中所有节点的左右子树
def invertTree(root: TreeNode) -> TreeNode:
# 当前节点为空,直接返回
if not root:
return None
# 交换当前节点的左右子树
root.left, root.right = root.right, root.left
# 递归遍历左子树
invertTree(root.left)
# 递归遍历右子树
invertTree(root.right)
# 返回交换后的二叉树
return root
```
使用示例:
```python
# 构建一棵二叉树
# 4
# / \
# 2 7
# / \ / \
# 1 3 6 9
root = TreeNode(4)
root.left = TreeNode(2, TreeNode(1), TreeNode(3))
root.right = TreeNode(7, TreeNode(6), TreeNode(9))
# 输出原始二叉树
print("原始二叉树:")
print(root.val)
print(root.left.val, root.right.val)
print(root.left.left.val, root.left.right.val, root.right.left.val, root.right.right.val)
# 交换二叉树中所有节点的左右子树
root = invertTree(root)
# 输出交换后的二叉树
print("交换后的二叉树:")
print(root.val)
print(root.left.val, root.right.val)
print(root.left.left.val, root.left.right.val, root.right.left.val, root.right.right.val)
```
输出结果:
```
原始二叉树:
4
2 7
1 3 6 9
交换后的二叉树:
4
7 2
9 6 3 1
```
可以看到,原始二叉树中节点的左右子树被成功交换了。
### 回答3:
要编写算法交换二叉树中所有结点的左右子树,可以采用递归方法实现。具体做法是:对于每个结点,都先交换其左右子树,然后再递归交换其左子树和右子树。
代码实现如下:
1. 首先定义一个交换左右子树的函数swapSubtree,该函数接受一个二叉树节点作为参数,直接交换该节点的左右子树。
```
void swapSubtree(TreeNode* root) {
if (!root) return; // 边界条件
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
}
```
2. 接下来,定义递归函数invertTree,该函数接受一个二叉树节点作为参数,先对该节点的左右子树进行交换操作,再递归地交换其左子树和右子树。
```
TreeNode* invertTree(TreeNode* root) {
if (!root) return NULL; // 边界条件
swapSubtree(root); // 交换该节点的左右子树
invertTree(root->left); // 递归交换左子树
invertTree(root->right); // 递归交换右子树
return root;
}
```
3. 最后,调用invertTree函数即可交换整个二叉树的左右子树。
```
TreeNode* result = invertTree(root); // root为二叉树的根节点,result为交换后的新二叉树根节点
```
以上就是交换二叉树中所有节点的左右子树的具体实现方法。
阅读全文