给定一个二叉树,编写一个有效的算法将二叉树转化成镜像
时间: 2024-05-04 17:19:24 浏览: 93
可以使用递归的方式将二叉树转化成镜像。对于每一个节点,交换其左右子树,然后递归处理其左右子树即可。
具体实现如下:
```
void mirror(TreeNode* root) {
if (root == nullptr) {
return;
}
// 交换左右子树
TreeNode* temp = root->left;
root->left = root->right;
root->right = temp;
// 递归处理左右子树
mirror(root->left);
mirror(root->right);
}
```
这个算法的时间复杂度为 $O(n)$,其中 $n$ 是二叉树的节点数。因为每个节点都会被访问一次,所以时间复杂度是线性的。
相关问题
给定一个二叉树,检查它是否是镜像对称的。c语言
给定一个二叉树,判断其是否是镜像对称,意味着如果将树从根节点开始左右翻转,得到的新树与原树是相同的结构。在C语言中,我们可以采用递归的方式进行这个操作:
首先,我们需要定义一个二叉树节点的结构体:
```c
typedef struct TreeNode {
int val;
struct TreeNode *left;
struct TreeNode *right;
} TreeNode;
```
然后,可以编写一个函数`isSymmetric(TreeNode* root)`来进行判断。该函数会比较当前节点的左孩子和右孩子的值,以及它们的左右孩子是否都满足对称条件:
```c
int isSymmetric(TreeNode* root) {
if (root == NULL) {
return 1; // 空树是镜像对称的
}
return isMirror(root->left, root->right);
}
int isMirror(TreeNode* node1, TreeNode* node2) {
if (node1 == NULL && node2 == NULL) {
return 1;
} else if (node1 != NULL && node2 != NULL) {
return node1->val == node2->val && isMirror(node1->left, node2->right) && isMirror(node1->right, node2->left);
} else {
return 0;
}
}
```
这个函数会先检查根节点的值是否相等,然后递归地对比两个子树是否对称。
一颗二叉树的镜像二叉树如果和原树的结构相同且点权相等。则该二叉树为对称二叉树。 给定一颗二叉树,判定其是否为对称二叉树。
判断一棵二叉树是否是对称的,可以采用递归的方法。基本思路是,对于树的根节点,我们比较它的左孩子和右孩子的高度是否相等,以及它们自身的值是否相等。如果是,则继续分别检查它们的左子树和右子树是否也是对称的;如果不是,则整棵树就不是对称的。
具体步骤如下:
1. 如果当前节点为空,那么它肯定是对称的,返回 true。
2. 如果左右子节点都不为空,我们需要比较 left = right 的镜像(即 right.left 和 left.right),并且 left.val == right.val。如果这两个条件都满足,我们再递归地检查 left 和 right 的子树是否对称。
3. 如果只有一边有子节点或者值不相等,说明当前节点的左右部分不对称,返回 false。
这个过程会一直递归到叶子节点,因为叶子节点没有子节点自然是对称的。
Python伪代码可以这样表示:
```python
def isSymmetric(root):
if root is None:
return True
if root.left and root.right and root.left.val != root.right.val:
return False
return isSymmetric(root.left) and isSymmetric(root.right)
```
阅读全文