数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)

简介: 数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)

数据结构和算法面试题:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)

简介:实现一个函数,将一棵二叉树转换为它的镜像。(递归或者非递归实现)

该算法的实现思路如下:

  1. 对于当前节点,交换其左右子树。
  2. 递归地对该节点的左右子树进行镜像转换。

下面是使用C++实现将一棵二叉树转换为它的镜像(非递归实现)的代码,并附带详细注释:

#include <iostream>
#include <stack>
using namespace std;
// 定义二叉树结构
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 将一棵二叉树转换为它的镜像(非递归实现)
void mirror_iterative(TreeNode* root) {
    if (root == nullptr) return;
    stack<TreeNode*> s{{root}};
    while (!s.empty()) {
        TreeNode* node = s.top();
        s.pop();
        swap(node->left, node->right); // 交换左右子树
        if (node->left != nullptr) s.push(node->left);
        if (node->right != nullptr) s.push(node->right);
    }
}
int main() {
    // 构造一棵二叉树
    TreeNode* root = new TreeNode(4);
    root->left = new TreeNode(2);
    root->right = new TreeNode(7);
    root->left->left = new TreeNode(1);
    root->left->right = new TreeNode(3);
    root->right->left = new TreeNode(6);
    root->right->right = new TreeNode(9);
    // 转换并输出镜像结果
    mirror_iterative(root);
    cout << root->val << endl;             // 4
    cout << root->left->val << " ";        // 7
    cout << root->left->left->val << " ";  // 9
    cout << root->left->right->val << " "; // 6
    cout << root->right->val << " ";       // 2
    cout << root->right->left->val << " "; // 3
    cout << root->right->right->val << endl;// 1
    return 0;
}

下面是同样功能的递归实现代码,也附有详细注释:

#include <iostream>
using namespace std;
// 定义二叉树结构
struct TreeNode {
    int val;
    TreeNode* left;
    TreeNode* right;
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
};
// 将一棵二叉树转换为它的镜像(递归实现)
void mirror_recursive(TreeNode* root) {
    if (root == nullptr) return;
    swap(root->left, root->right); // 交换当前节点的左右子树
    // 递归对左右子树进行镜像操作
    mirror_recursive(root->left);
    mirror_recursive(root->right);
}
int main() {
    // 构造一棵二叉树
    TreeNode* root = new TreeNode(4);
    root->left = new TreeNode(2);
    root->right = new TreeNode(7);
    root->left->left = new TreeNode(1);
    root->left->right = new TreeNode(3);
    root->right->left = new TreeNode(6);
    root->right->right = new TreeNode(9);
    // 转换并输出镜像结果
    mirror_recursive(root);
    cout << root->val << endl;             // 4
    cout << root->left->val << " ";        // 7
    cout << root->left->left->val << " ";  // 9
    cout << root->left->right->val << " "; // 6
    cout << root->right->val << " ";       // 2
    cout << root->right->left->val << " "; // 3
    cout << root->right->right->val << endl;// 1
    return 0;
}

这两份代码均以定义二叉树结构的方式构建二叉树。mirror_iterative()函数使用栈进行非递归实现,从而避免了函数调用的栈深,降低了空间复杂度;而mirror_recursive()函数则使用递归实现,代码更加简洁易懂。两个函数的思路都是:对于一个节点,交换其左右子树后,递归地对其左右子树进行同样的操作。

相关文章
|
13天前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
117 67
|
4月前
|
Java
【Java集合类面试二十六】、介绍一下ArrayList的数据结构?
ArrayList是基于可动态扩展的数组实现的,支持快速随机访问,但在插入和删除操作时可能需要数组复制而性能较差。
|
21天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
43 4
|
2月前
|
算法 前端开发 Java
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
这篇文章总结了单链表的常见面试题,并提供了详细的问题分析、思路分析以及Java代码实现,包括求单链表中有效节点的个数、查找单链表中的倒数第k个节点、单链表的反转以及从尾到头打印单链表等题目。
35 1
数据结构与算法学习四:单链表面试题,新浪、腾讯【有难度】、百度面试题
|
1月前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
3月前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
33 3
|
4月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
6月前
|
存储 JavaScript 前端开发
JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)
【6月更文挑战第25天】JavaScript中的对象是数据结构,存储键值对,键为字符串,值可为任意类型,包括函数(作为方法)。
42 2
|
5月前
|
算法 Python
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
`scipy.optimize`模块提供了许多用于优化问题的函数和算法。这些算法可以用于找到函数的最小值、最大值、零点等。
|
5月前
|
算法 安全 数据安全/隐私保护
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹
支付系统---微信支付09------数字签名,现在Bob想要给Pink写一封信,信件的内容不需要加密,怎样能够保证信息的完整性,使用信息完整性的主要手段是摘要算法,散列函数,哈希函数,H称为数据指纹