题目描述
操作给定的二叉树,将其变换为源二叉树的镜像。
输入描述:
二叉树的镜像定义:源二叉树
8
/
6 10
/ \ /
5 7 9 11
镜像二叉树
8
/
10 6
/ \ /
11 9 7 5
思路一:递归:若root为空,若root.left and root.right都为空,则返回;
其次进行左右节点交换;
然后左节点不空,则左节点Mirror;右节点不空,则右节点Mirror
python要返回root, 用 is None or is not None来判断;java无返回值,需定义临时节点tmp用于交换
# -*- coding:utf-8 -*-
# class TreeNode:
# def __init__(self, x):
# self.val = x
# self.left = None
# self.right = None
class Solution:
# 返回镜像树的根节点
def Mirror(self, root):
# write code here
if root is None:
return
if (root.left is None and root.right is None):
return
tmp=root.left
root.left=root.right
root.right=tmp
if root.left is not None:
self.Mirror(root.left)
if root.right is not None:
self.Mirror(root.right)
return root
/**
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 tmp=root.left;
root.left=root.right;
root.right=tmp;
if (root.left!=null) Mirror(root.left);
if(root.right!=null) Mirror(root.right);
}
}
思路二:利用堆栈:
若root为空,若root.left and root.right都为空,则返回;
其次创建树节点的栈,将根节点入栈,只要栈不空,则出栈节点,循环交换;
循环交换:左or右节点不空,则交换;
然后左节点不空,则左节点入栈;右节点不空,则右节点入栈
TreeNode right = null;
public TreeNode(int val) {
this.val = val;
}
}
*/
import java.util.Stack;
public class Solution {
public void Mirror(TreeNode root) {
if (root==null) return;
if (root.left==null && root.right==null) return;
Stack<TreeNode> treestack=new Stack<>();
treestack.push(root);
while(!treestack.isEmpty()){
TreeNode node=treestack.pop();//创建新的节点为栈中出栈的节点
if (node.left!=null || node.right!=null){
TreeNode tmp=node.left;
node.left=node.right;
node.right=tmp;
}
if (node.left!=null) treestack.push(node.left);
if(node.right!=null) treestack.push(node.right);
}
}
}