java二叉树镜像_二叉树的镜像

130

推荐

/* struct TreeN

查看全部

编辑于 2015-06-19 17:41:47

回复(65)

89

/* 先前序遍历这棵树的每个结点,如果遍历到的结点有子结点,就交换它的两个子节点,

当交换完所有的非叶子结点的左右子结点之后,就得到了树的镜像 */

/**

public class TreeNode {

int val = 0;

TreeNode left = null;

TreeNode right = null;

public TreeNode(int val) {

this.val = val;

}

}

*/

public class Solution {

public void Mirror(TreeNode root) {

if(root == null)

return;

if(root.left == null && root.right == null)

return;

TreeNode pTemp = root.left;

root.left = root.right;

root.right = pTemp;

if(root.left != null)

Mirror(root.left);

if(root.right != null)

Mirror(root.right);

}

}

发表于 2016-08-29 08:29:15

回复(31)

121

class Solution {

public:

void Mirror(TreeNode *pRoot) {

//递归实现

/*if(pRoot==NULL)

return;

TreeNode *ptemp=pRoot->left;

pRoot->left=pRoot->right;

pRoot->right=ptemp;

if(pRoot->left)

Mirror(pRoot->left);

if(pRoot->right)

Mirror(pRoot->right);*/

//非递归实现

if(pRoot==NULL)

return;

stack stackNode;

stackNode.push(pRoot);

while(stackNode.size()){

TreeNode* tree=stackNode.top();

stackNode.pop();

if(tree->left!=NULL || tree->right!=NULL){

TreeNode *ptemp=tree->left;

tree->left=tree->right;

tree->right=ptemp;

}

if(tree->left)

stackNode.push(tree->left);

if(tree->right)

stackNode.push(tree->right);

}

}

};

编辑于 2015-07-07 15:50:30

回复(38)

39

python解法: class Solution:

def Mirror(self, root):

# write code here

if not root:

return root

node=root.left

root.left=root.right

root.right=node

self.Mirror(root.left)

self.Mirror(root.right)

return root

发表于 2017-10-13 21:36:44

回复(28)

54

class Solution {

public:

void Mirror(TreeNode *p) {

if(p){

swap(p -> left, p -> right);

Mirror(p -> left);

Mirror(p -> right);

}

}

};

发表于 2015-08-22 23:40:48

回复(11)

34

题目描述

c235d4dae00f4a71b051ded808b9ed5d.png

解题思路

我们或许还记得递归的终极思想是数学归纳法,我们思考递归的时候一定不要去一步一步看它执行了啥,只会更绕。我们牢牢记住,思考的方式是我们首先假设子问题都已经完美处理,我只需要处理一下最终的问题即可,子问题的处理方式与最终那个处理方式一样,但是问题规模一定要以1的进制缩小。最后给一个递归出口条件即可。

对于本题,首先假设root的左右子树已经都处理好了,即左子树自身已经镜像了,右子树自身也镜像了,那么最后一步就是交换左右子树,问题解决。所以我只需要将root.left和root.right交换即可。下面进入递归,就是处理子问题。子问题的处理方式与root一样,只是要缩小问题规模,所以只需要考虑root.left是什么情况,root.right是什么情况即可。

我的答案 public class Solution {

public void Mirror(TreeNode root) {

reverseTree(root);

}

private void reverseTree(TreeNode root){

//为空则结束

if(root == null){

return;

}

//假设root两边的子树自己都已经翻转成功了,那么只需要再将左右子树互换一下就成功了

//交换root的左右子树

swap(root);

//左右子树翻转自己去处理就行了,我们规定每个子树的root都跟最终的root处理方式一样即可

reverseTree(root.left);

reverseTree(root.right);

}

private void swap(TreeNode root){

TreeNode node = null;

node = root.left;

root.left = root.right;

root.right = node;

}

}

发表于 2019-03-07 17:43:16

回复(10)

32

import java.util.Stack;

public class Solution {

public void Mirror(TreeNode root) {

if(root == null){

return;

}

Stack stack = new Stack();

stack.push(root);

while(!stack.isEmpty()){

TreeNode node = stack.pop();

if(node.left != null||node.right != null){

TreeNode temp = node.left;

node.left = node.right;

node.right = temp;

}

if(node.left!=null){

stack.push(node.left);

}

if(node.right!=null){

stack.push(node.right);

}

}

}

}

发表于 2016-05-11 22:18:41

回复(14)

31

class Solution {

public:

//栈的非递归

void Mirror(TreeNode *pRoot) {

if (pRoot == NULL)return;

stack st;

TreeNode* p = NULL;

st.push(pRoot);

while (st.size())

{

p = st.top();

st.pop();

swap(p->left, p->right);

if (p->left)st.push(p->left);

if (p->right)st.push(p->right);

}

} //队列的非递归

void Mirror(TreeNode *pRoot) {

if (pRoot == NULL)return;

queue qu;

TreeNode* p = NULL;

qu.push(pRoot);

while (qu.size())

{

p = qu.front();

qu.pop();

swap(p->left, p->right);

if (p->left)qu.push(p->left);

if (p->right)qu.push(p->right);

}

}

//递归

void Mirror(TreeNode *pRoot) {

if (pRoot == NULL)return;

swap(pRoot->left, pRoot->right);

Mirror(pRoot->left);

Mirror(pRoot->right);

}

};

编辑于 2016-08-07 20:54:31

回复(7)

11

//非递归, 层次遍历+swap

class Solution {

public:

void Mirror(TreeNode *pRoot) {

if (!pRoot) return;

vector vv;

vv.push_back(pRoot);

while (!vv.empty()) {

vector t;

for (auto &i : vv) {

swap(i->left, i->right);

if (i->left) t.push_back(i->left);

if (i->right) t.push_back(i->right);

}

vv.swap(t);

}

}

};

编辑于 2015-11-25 22:43:22

回复(2)

6

1. 解法

//自上而下的递归调用

void Mirror(TreeNode *pRoot) {

if(pRoot != NULL){

//先交换当前节点的两个子树节点

TreeNode *tmpNode = pRoot->left;

pRoot->left = pRoot->right;

pRoot->right = tmpNode;

//对交换后的节点做同样的事。

Mirror(pRoot->left);

Mirror(pRoot->right);

}

}

2.我觉得这题和《剑指offer》中的42题(字符串操作)思路有点像:

42题要求翻转单词顺序:"I am a student."  ->

"student. a am I"

第一步:翻转所有的字符,eg: "I am a student."  ->

".tneduts a ma I"

第二步:再翻转每个单词中的顺序,eg:

".tneduts a ma I"  ->

"student. a am I"

3.其他相近的树操作的题目:

对称树:https://leetcode.com/problems/symmetric-tree/#/description

相等树:https://leetcode.com/problems/same-tree/#/description

发表于 2017-04-05 15:45:27

回复(2)

14

事实上二叉树的原理很简单,只是我不熟练

发表于 2017-09-05 20:50:50

回复(0)

5

Python解法:

class Solution:

def Mirror(self, root):

# write code here

if root:#如果存在根节点

root.left,root.right=root.right,root.left#根节点左右交换,俩变量交换也可以这样写

self.Mirror(root.left)#递归调用左节点

self.Mirror(root.right)#递归调用右节点

return root#返回节点

else:

return #else无节点时直接return

编辑于 2018-11-07 21:59:29

回复(2)

5

递归解法(JavaScript) function Mirror(root)

{

if(root === null) return root;

[root.left, root.right] = [root.right, root.left];

Mirror(root.left);

Mirror(root.right);

}

非递归解法 function Mirror(root)

{

if(root === null) return root;

let stack = [root];

while(stack.length){

let x = stack.pop();

[x.left, x.right] = [x.right, x.left];

if(x.left) stack.push(x.left);

if(x.right) stack.push(x.right);

}

}

编辑于 2018-04-25 10:46:38

回复(2)

17

最佳答案,没有之一:

public class Solution {

public void Mirror(TreeNode root) {

if(root != null){

Mirror(root.left);

Mirror(root.right);

TreeNode temp = root.left;

root.left=root.right;

root.right = temp;

}

}

}

发表于 2015-08-30 23:12:23

回复(14)

5

class Solution {

public:

void Mirror(TreeNode *p)

{

if(p==NULL) return;

TreeNode *tmp=p->left;

p->left=p->right;

p->right=tmp;

Mirror(p->left);

Mirror(p->right);

}

};

发表于 2016-08-15 01:09:14

回复(1)

5

//凡是二叉树相关的问题一定要好好理解二叉树的递归定义,

void Mirror(TreeNode *pRoot)

{

if (pRoot == NULL)

return;

//交换左右孩子的次序可以在递归之前,也可以在递归之后,但是感觉在递归之后比较好

TreeNode *ptemp;

ptemp = pRoot->left;

pRoot->left = pRoot->right;

pRoot->right = ptemp;

Mirror(pRoot->left);

Mirror(pRoot->right);

return ;

}

发表于 2015-09-29 13:38:07

回复(3)

2

public void Mirror(TreeNode root) {

if(root == null) {

return;

}

TreeNode temp = root.left;

root.left = root.right;

root.right = temp;

Mirror(root.left);

Mirror(root.right);

}

发表于 2018-08-11 12:29:46

回复(0)

2

class Solution {

public:

void Mirror(TreeNode *p) {

if(!p) return ;

Mirror(p->left);

Mirror(p->right);

swap(p->left,p->right);

}

};

发表于 2017-05-31 20:57:29

回复(0)

2

class Solution {

public:

void Mirror(TreeNode *pRoot) {

if (pRoot==NULL || (pRoot->left==NULL && pRoot->right==NULL)) {

return;

}

TreeNode *treeTemp = pRoot->left;

pRoot->left = pRoot->right;

pRoot->right = treeTemp;

if(pRoot->left)

Mirror(pRoot->left);

if(pRoot->right)

Mirror(pRoot->right);

}

};

发表于 2015-10-23 11:26:44

回复(0)

1

Java:

/**

* public class TreeNode {

* int val = 0;

* TreeNode left = null;

* TreeNode right = null;

* public TreeNode(int val) {

* this.val = val;

* }

* }

*/

public class Solution {

public void Mirror(TreeNode root) {

if (root == null) return;

TreeNode tmp = root.left;

root.left = root.right;

root.right = tmp;

Mirror(root.left);

Mirror(root.right);

}

}

C++:

/**

struct TreeNode {

int val;

struct TreeNode *left;

struct TreeNode *right;

TreeNode(int x) :

val(x), left(NULL), right(NULL) {

}

};*/

class Solution {

public:

void Mirror(TreeNode *pRoot) {

if (pRoot == nullptr) return;

TreeNode* tmp = pRoot->left;

pRoot->left = pRoot->right;

pRoot->right = tmp;

Mirror(pRoot->left);

Mirror(pRoot->right);

}

};

编辑于 2021-02-14 11:48:43

回复(0)

1

public class Solution {

public void Mirror(TreeNode root) {

if(root == null) return ;

TreeNode tempNode = root.left;

root.left = root.right;

root.right = tempNode;

Mirror(root.left);

Mirror(root.right);

}

}

发表于 2021-02-01 19:36:59

回复(0)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值