面试题27:二叉树的镜像(C++)
时间:2020-04-06
本文章向大家介绍面试题27:二叉树的镜像(C++),主要包括面试题27:二叉树的镜像(C++)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
题目地址:https://leetcode-cn.com/problems/er-cha-shu-de-jing-xiang-lcof/
题目描述
请完成一个函数,输入一个二叉树,该函数输出它的镜像。
例如输入:
4
/ \
2 7
/ \ / \
1 3 6 9
镜像输出:
4
/ \
7 2
/ \ / \
9 6 3 1
题目示例
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
解题思路
DFS:先序遍历实现
(1)递归方法:只要涉及到二叉搜索树,均可以使用递归解决,分析题目发现,二叉树的镜像是通过交换左右子树的节点转换而成的,我们利用二叉树的先序遍历特点递归实现,主要是交换子树左右节点。
(2)栈方法:二叉树的先序遍历方法有两种,一种是递归方法,另一种是非递归方法,即栈实现,在这里我们使用栈的方法解决,具体思路是将根节点压入栈,然后交换栈顶元素左右子树,将交换后的左右节点分别压入栈的左节点和右节点,然后当栈不为空时返回即可。
BFS:层次遍历实现
队列方法:使用队列的方法,一层一层遍历,然后交换队首元素的左右子树
程序源码
递归
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* mirrorTree(TreeNode* root) { if(root == nullptr) return nullptr; TreeNode* p = root->left; root->left = mirrorTree(root->right); root->right = mirrorTree(p); /* if(root == nullptr) return nullptr; swap(root->left, root->right); mirrorTree(root->left); mirrorTree(root->right); return root; */ return root; } };
栈(非递归)
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* mirrorTree(TreeNode* root) { if(root == nullptr) return nullptr; stack<TreeNode* > s; s.push(root); while(!s.empty()) { TreeNode* p = s.top(); s.pop(); if(p == nullptr) continue; TreeNode* q = p->left; p->left = p->right; p->right = q; s.push(p->left); s.push(p->right); } return root; } };
队列
/** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ class Solution { public: TreeNode* mirrorTree(TreeNode* root) { if(root == nullptr) return nullptr; queue<TreeNode* > que; que.push(root); while(!que.empty()) { TreeNode* p = que.front(); que.pop(); if(p == nullptr) continue; TreeNode* q = p->left; p->left = p->right; p->right = q; que.push(p->left); que.push(p->right); } return root; } };
原文地址:https://www.cnblogs.com/wzw0625/p/12640690.html
- 妹子你真萌:一次心惊肉跳的服务器误删文件的恢复过程
- Go语言使用sort包对任意类型元素的集合进行排序的方法
- Oracle 12c ASM专题|Flex Diskgroup相关概念
- 移动搜索SEO分享:利用Meta声明来做百度开放适配
- 百度分享无法抓取图片及摘要的折中解决办法
- Golang 持久化
- Golang context 包入门
- 动手实现一个JSON验证器(上)
- Go语言实现冒泡和快速排序
- 利用Meta申明来做百度、谷歌、雅虎、微软等搜索的开放适配
- 【Oracle 12c ASM专题】——我的第一个Flex Diskgroup
- 编写一个go gRPC的服务
- GO语言使用gopsutil包进行机器信息采集
- redigo 连接池代码分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Linux本机与服务器文件互传及Linux服务器文件上传下载命令写法
- linux利用read命令获取变量中的值
- 解决Centos7 安装腾达U12无线网卡驱动问题
- CentOS 6.5上编译安装Apache服务器的方法(最小化安装)
- 固定QPS压测模式探索
- Centos6 网络配置的实例详解
- centos6.5升级安装配置supervisor的教程
- Linux的路由表详细介绍
- Centos7.3下vsftp服务的安装方法
- 详解Linux 安装 JDK、Tomcat 和 MySQL(图文并茂)
- 浅析Linux root设置初始值的方法
- 详解 Linux中的关机和重启命令
- 数据分析入门系列教程-KNN原理
- Selenium自动化的JUnit参数化实践
- linux云主机安装pdo详细教程