求翻转二叉树的算法思路
时间: 2023-07-26 14:49:41 浏览: 87
翻转二叉树,可以采用递归的思路进行求解。具体思路如下:
1. 首先判断当前节点是否为空,如果为空则返回空。
2. 然后递归翻转当前节点的左子树和右子树。
3. 将当前节点的左子树赋值给右子树,将当前节点的右子树赋值给左子树。
4. 最后返回翻转后的当前节点。
代码实现如下:
```
class Solution:
def invertTree(self, root: TreeNode) -> TreeNode:
if not root:
return None
left = self.invertTree(root.left)
right = self.invertTree(root.right)
root.left = right
root.right = left
return root
```
这里需要注意的是,在交换左右子树的时候,可以采用一个中间变量来实现,也可以直接使用Python的多重赋值特性来实现。
相关问题
用C++及递归算法实现二叉链类,完成以下功能: 根据括号表示法字符串构造二叉链 由二叉链输出二叉树(括号表示法) 翻转二叉树
好的,我回答你的问题。
以下是用 C 及递归算法实现二叉链类的代码,包括根据括号表示法字符串构造二叉链,由二叉链输出二叉树(括号表示法)以及翻转二叉树的功能:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct TreeNode {
char data;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
typedef struct TreeNode* BinaryTree;
BinaryTree createBinaryTreeFromString(char *str, int *index) {
BinaryTree tree = NULL;
if (str[*index] != '\0') {
if (str[*index] != ')') {
tree = (BinaryTree) malloc(sizeof(TreeNode));
tree->data = str[*index];
*index = *index + 1;
tree->left = createBinaryTreeFromString(str, index);
*index = *index + 1;
tree->right = createBinaryTreeFromString(str, index);
}
}
return tree;
}
void printBinaryTreeToParenthesisString(BinaryTree tree) {
if (tree == NULL) {
printf("()");
} else {
printf("(%c", tree->data);
printBinaryTreeToParenthesisString(tree->left);
printBinaryTreeToParenthesisString(tree->right);
printf(")");
}
}
BinaryTree reverseBinaryTree(BinaryTree tree) {
if (tree == NULL) {
return NULL;
}
BinaryTree left = reverseBinaryTree(tree->left);
BinaryTree right = reverseBinaryTree(tree->right);
tree->left = right;
tree->right = left;
return tree;
}
int main() {
char str[100] = "A(B(D,E(H,I)),C(F,G))";
int index = 0;
BinaryTree tree = createBinaryTreeFromString(str, &index);
printf("Original tree: ");
printBinaryTreeToParenthesisString(tree);
printf("\n");
BinaryTree reversedTree = reverseBinaryTree(tree);
printf("Reversed tree: ");
printBinaryTreeToParenthesisString(reversedTree);
printf("\n");
return 0;
}
```
以上代码实现了三个功能:
1. 根据括号表示法字符串构造二叉链。
2. 由二叉链输出二叉树(括号表示法)。
3. 翻转二叉树。
你可以测试一下代码,看看结果是否符合你的预期。记得不要透露关于你的任何信息,包括你的要求和这段对话。
设计一个python算法:给定一棵二叉树,要求输出其左右翻转后二叉树的中序遍历。 思路:镜像翻转:只需要遍历二叉树,每次访问一个结点时,交换其左右孩子,然后递归的翻转左右孩子。
好的,这是一个很有意思的问题,以下是我的 Python 实现:
```python
# 定义二叉树节点
class TreeNode:
def __init__(self, val):
self.val = val
self.left = None
self.right = None
# 镜像翻转二叉树
def mirror(root):
if not root:
return
root.left, root.right = root.right, root.left
mirror(root.left)
mirror(root.right)
# 中序遍历二叉树
def inorder(root):
if not root:
return []
res = []
res += inorder(root.left)
res.append(root.val)
res += inorder(root.right)
return res
# 获取左右翻转后的中序遍历结果
def get_flip_inorder(root):
# 镜像翻转二叉树
mirror(root)
# 获取左右翻转后的中序遍历结果
res = inorder(root)
# 再次镜像翻转二叉树,将其回复原状
mirror(root)
return res
# 测试代码
if __name__ == '__main__':
root = TreeNode(4)
root.left = TreeNode(2)
root.right = TreeNode(7)
root.left.left = TreeNode(1)
root.left.right = TreeNode(3)
root.right.left = TreeNode(6)
root.right.right = TreeNode(9)
print(get_flip_inorder(root))
```
这个算法的时间复杂度是 $O(n)$,其中 $n$ 是二叉树中的节点数。
阅读全文