Leetcode226. 翻转二叉树(递归、迭代、层序三种解法)

目录

    • 题目
    • 1、层序法:
    • 2、递归法:
      • 1、先序遍历(中左右)
      • 2、后序遍历(左右中)
      • 3、递归中序遍历为什么不行(左中右)
    • 3、迭代法:
      • 1、先序遍历
      • 2、中序遍历
      • 3、后序遍历
      • 为什么迭代法的中序遍历有效?

题目

翻转一棵二叉树。

示例:

输入:

 4

/
2 7
/ \ /
1 3 6 9
输出:
4
/
7 2
/ \ /
9 6 3 1

1、层序法:

层序遍历,然后将同一层的所有结点的左右孩子交换

/*** 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* invertTree(TreeNode* root) {queue<TreeNode*> que;if(root!=NULL) que.push(root);while(!que.empty()){int size = que.size();for(int i =0;i<size;i++){TreeNode* node = que.front();que.pop();TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;//将左右孩子结点入队列,作为下一层的元素if(node->left) que.push(node->left);if(node->right) que.push(node->right);}}return root;}
};

在这里插入图片描述

2、递归法:

遍历的过程中去翻转每一个结点的左右孩子就可以达到整体翻转的效果。
可以使用先序遍历和后序遍历,而中序遍历会把某些结点的左右孩子翻转两次。

1、先序遍历(中左右)

递归思考过程:
1、返回值:void 形参:指向结点的指针
2、终止条件:指向结点的指针为空指针
3、递归内部逻辑:先翻转指针指向的结点的左右孩子,然后递归遍历左右子树

/*** 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:void traversal(TreeNode* cur){//终止条件if(cur == NULL) return;//逻辑:先交换左右子树内容,然后对左右子树依次进行遍历TreeNode* tmp;tmp = cur->left;cur->left = cur->right;cur->right = tmp;traversal(cur->left);traversal(cur->right);}TreeNode* invertTree(TreeNode* root) {traversal(root);return root;}
};

在这里插入图片描述

2、后序遍历(左右中)

递归思考过程:
1、返回值:void 形参:指向结点的指针
2、终止条件:指向结点的指针为空指针
3、递归内部逻辑:先递归遍历左右子树,再翻转指针指向的结点的左右孩子

/*** Definition for a binary tree node.* struct TreeNode {*     int val;*     TreeNode *left;*     TreeNode *right;*     TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/
/*** 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:void traversal(TreeNode* cur){//终止条件if(cur == NULL) return;traversal(cur->left);traversal(cur->right);TreeNode* tmp;tmp = cur->left;cur->left = cur->right;cur->right = tmp;}TreeNode* invertTree(TreeNode* root) {traversal(root);return root;}
};

为什么后序遍历的方法更加快捷?
在这里插入图片描述

3、递归中序遍历为什么不行(左中右)

中序遍历之后是这样的:
在这里插入图片描述
因为交换完左右结点后,想要遍历右子树,实际由于进行了交换操作,遍历的还是原来的左子树。
如下图:
在这里插入图片描述

3、迭代法:

1、先序遍历

/*** 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* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root !=NULL) st.push(root);while(!st.empty()){TreeNode* node = st.top();  //标记操作,直到遇到NULLif(node!=NULL){//将该结点弹出,避免重复操作st.pop();//添加右结点if(node->right) st.push(node->right);//添加左结点if(node->left) st.push(node->left);//添加中结点st.push(node);//标记st.push(NULL); }//只有遇到空结点的时候,才将下一个结点的左右子结点进行交换else{//弹出空结点st.pop();node = st.top();st.pop();   TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;}}return root;}
};

2、中序遍历

/*** 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* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root !=NULL) st.push(root);while(!st.empty()){TreeNode* node = st.top();  //标记操作,直到遇到NULLif(node!=NULL){//将该结点弹出,避免重复操作st.pop();//添加右结点if(node->right) st.push(node->right);//添加中结点st.push(node);//标记st.push(NULL); //添加左结点if(node->left) st.push(node->left);}//只有遇到空结点的时候,才将下一个结点的左右子结点进行交换else{//弹出空结点st.pop();node = st.top();st.pop();   TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;}}return root;}
};

3、后序遍历

/*** 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* invertTree(TreeNode* root) {stack<TreeNode*> st;if(root !=NULL) st.push(root);while(!st.empty()){TreeNode* node = st.top();  //标记操作,直到遇到NULLif(node!=NULL){//将该结点弹出,避免重复操作st.pop();//添加中结点st.push(node);//标记st.push(NULL); //添加右结点if(node->right) st.push(node->right);//添加左结点if(node->left) st.push(node->left);}//只有遇到空结点的时候,才将下一个结点的左右子结点进行交换else{//弹出空结点st.pop();node = st.top();st.pop();   TreeNode* tmp;tmp = node->left;node->left = node->right;node->right = tmp;}}return root;}
};

为什么迭代法的中序遍历有效?

迭代的中序方法可以,因为先将交换前的右子树值存放到栈内了,即使后面进行了交换,想要遍历右子树时,是取栈内交换前的右子树值,而不是交换后的。
如图:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/378031.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Asp.net 获取当前目录的三种方法

方法一&#xff1a; string sPath System.IO.Path.GetDirectoryName(Page.Request.PhysicalPath) 方法二&#xff1a; string sPath System.Web.HttpContext.Current.Request.MapPath("/") 方法三&#xff1a; string s…

一款jQuery立体感动态下拉导航菜单特效

一款jQuery立体感动态下拉导航菜单特效,鼠标经过&#xff0c;在菜单栏上方下拉出一个背景图片&#xff0c;效果十分不错的一款jquery特效。 对IE6都是兼容的&#xff0c;希望大家好好研究研究。 适用浏览器&#xff1a;IE6、IE7、IE8、360、FireFox、Chrome、Safari、Opera、傲…

七、模糊操作

一、模糊操作基本原理 1&#xff0c;基于离散卷积 2&#xff0c;定义好每一个卷积核 3&#xff0c;不同卷积核得到不同的卷积效果 4&#xff0c;模糊是卷积的一种表象 二、1*3卷积核举例 每次右移一格&#xff0c;进行对应相乘再求和。1*3的卷积核左右两边的元素并没有处理而…

LeetCode 100. 相同的树 思考分析

给定两个二叉树&#xff0c;编写一个函数来检验它们是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 示例 1: 输入: 1 1 / \ / 2 3 2 3 [1,2,3], [1,2,3]输出: true 示例 2: 输入: 1 1 / 2 2 [1,2], [1,null,2]输…

在Python中以二进制格式输入数字

Syntax to convert binary value to an integer (decimal format), 将二进制值转换为整数(十进制格式)的语法&#xff0c; int(bin_value, 2)Here, 这里&#xff0c; bin_value should contain the valid binary value bin_value应该包含有效的二进制值 2 is the base value …

八、边缘保留滤波(EPF)

一、概念 边缘保留滤波(EPF,edge preserving filtering) 二、高斯双边 cv2.bilateralFilter(image,0,100,15)100为差异&#xff0c;15为周围的区域 import cv2 import numpy as npdef bilateralFilter(image):dst cv2.bilateralFilter(image,0,100,15)cv2.imshow(bilater…

LintCode 375. 克隆二叉树(深复制)

先序遍历构造二叉树 TreeNode * preorder(TreeNode * root){if(rootNULL) return NULL;TreeNode * ans;ansnew TreeNode(root->val);if(root->left!NULL){ans->leftpreorder(root->left);}if(root->right!NULL){ans->rightpreorder(root->right);}return…

关于ECMAScript基础入门的分享

目录 ECMAScript基础入门1. 介绍2. 变量与数据类型2.1 变量2.2 数据类型 3. 运算符3.1 算术运算符3.2 比较运算符 4. 控制流4.1 条件语句4.2 循环语句 5. 函数6. 对象与数组6.1 对象6.2 数组 7. 总结 ECMAScript基础入门 1. 介绍 ECMAScript是JavaScript的标准规范&#xff0…

kotlin 计算平方_Kotlin程序来计算复利

kotlin 计算平方Compound interest is the sum of principal amount and interest of interest. 复利是本金和利息之和。 Given, principal, rate, and time, we have to calculate the Compound interest. 给定本金&#xff0c;利率和时间&#xff0c;我们必须计算复利。 Fo…

近代科学为什么诞生在西方-1

宽泛的讲&#xff0c;近代科学是几种文明在长达几个世纪的持续交流碰撞中产生的。它正在日益成为全世界全人类都有效的普适科学。通向现代科学之路就是通向自由和开放交流之路。 马克思韦伯和莫顿都认为&#xff0c;科学事业要持续的进步就要特定的文化和制度的支持。 中国的数…

九、图像直方图

一、图像直方图的属性 说白了就是将图像上的各个颜色通道上的像素点的像素值进行统计&#xff0c;例如&#xff1a;像素值为14的像素点个数有几个&#xff0c;进行显示。 图像的像素值取值范围为[0,255]&#xff0c;这个范围也成为直方图的range也就是直方图的横坐标轴 每一个…

BIFR的完整形式是什么?

BIFR&#xff1a;工业和金融重组委员会 (BIFR: Board of Industrial and Financial Reconstruction) BIFR is an abbreviation of the Board of Industrial and Financial Reconstruction. It was an organization of the Government of India and a branch of the Department …

LeetCode 101. 对称二叉树 思考分析

题目 给定一个二叉树&#xff0c;检查它是否是镜像对称的。 例如&#xff0c;二叉树 [1,2,2,3,4,4,3] 是对称的。 1/ 2 2 / \ / 3 4 4 3 但是下面这个 [1,2,2,null,3,null,3] 则不是镜像对称的: 1/ 2 2 \ 3 3 进阶&#xff1a; 你可以运用递归和迭代两种方法解决这个…

内心能不能宁静一点,做事能不能坚持一下

内心能不能宁静一点&#xff0c;做事能不能坚持一下 每次朋友问我怎么样&#xff0c;我总感觉不好回答&#xff0c;如果说实话我想他们或许是不能理解我的处境的&#xff0c;只能报以“还好”之类的语言&#xff0c;糊弄一下。唯一一次说了实话是&#xff1a;我坠落了&#xff…

直方图反向投影

通过直方图反向投影&#xff0c;根据目标衣服颜色的特征来进行定位 cv2.calcHist([roi_hsv],[0,1],None,[32,48],[0,180,0,256])其中[32,48]表示bin的个数&#xff0c;可以修改&#xff0c;当然范围越小越精确 import cv2 import numpy as np from matplotlib import pyplot …

javascript 排序_JavaScript中的排序方法

javascript 排序There are tons of sorting algorithms available like bubble sort, merge sort, insertion sort etc. You must have implemented some of these in other programming languages like C or C. But in this article, I will be demonstrating the Sorting met…

LeetCode 二叉树、N叉树的最大深度与最小深度(递归解)

目录104. 二叉树的最大深度559. N叉树的最大深度111. 二叉树的最小深度之前的笔记中&#xff0c;已经用层序遍历解决过这个问题了现在试着用深度的解法去求解104. 二叉树的最大深度 给定一个二叉树&#xff0c;找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径…

十、模板匹配

一、概念 模板匹配就是在整个图像区域发现与给定子图像匹配的小块区域。 需要首先给定一个模板图像A&#xff0c;和一个待检测图像B。 在待检测图像B上&#xff0c;从左往右&#xff0c;从上往下计算待检测图像B和模板图像A所重叠的匹配度&#xff0c;匹配度越高则两者相同的可…

基于WF的意见征集4(浅析)

接口项目&#xff1a;IClass&#xff08;项目名称&#xff09; HTHuiFuusing System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Workflow.Runtime;using System.Workflow.Activities;namespace IClass{ /// <summary> /…

那些VisualStudio隐藏的调试功能

VisualStudio是一个强大的调试工具&#xff0c;里面很多隐藏功能少有人问津&#xff0c;但是在特定场景可以节省你很多时间&#xff0c;本文主要介绍一些VisualStudio调试相关的隐藏功能&#xff0c;欢迎大家补充。 运行到指针(Run to cursor) 大多数人用Visual Studio在调试程…