树 --- leedcode 226 翻转二叉树 (Easy)
程序员文章站
2022-05-20 10:33:26
...
题目
翻转一棵二叉树。
示例:
输入:
4
/ \
2 7
/ \ / \
1 3 6 9
输出:
4
/ \
7 2
/ \ / \
9 6 3 1
解析
方法一:递归
思路: 将每一个节点的左右子树都进行交换
java代码:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) {
return null;
}
swap(root);
// 递归交换每个节点的左右子树
invertTree(root.left);
invertTree(root.right);
return root;
}
// 交换左右子树
private void swap(TreeNode root){
if(root.left == null && root.right == null)
return;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
js代码:
var invertTree = function(root) {
if(root == null) {
return null;
}
swap(root);
invertTree(root.left);
invertTree(root.right);
return root;
function swap(root) {
if(root.left == null && root.right == null)
return;
var temp = root.left;
root.left = root.right;
root.right = temp;
}
};
方法二: 层次遍历
层次遍历:使用队列来实现。
java代码:
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null) {
return null;
}
// 创建一个队列
Queue <TreeNode> queue = new LinkedList<>();
// 根节点入队
queue.offer(root);
while(!queue.isEmpty()){
// 取出队首
TreeNode node = queue.poll();
// 交换左右子树
swap(node);
// 如果左右子树不为空加入到队列中
if(node.left != null) {
queue.offer(node.left);
}
if(node.right != null) {
queue.offer(node.right);
}
}
return root;
}
// 交换左右子树
private void swap(TreeNode root){
if(root.left == null && root.right == null)
return;
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
}
}
js代码:
var invertTree = function(root) {
if(root == null) {
return null;
}
// 创建一个队列
let queue = [];
// 根节点入队
queue.push(root);
while(queue.length != 0){
// 取出队首
let node = queue.shift();
// 交换左右子树
let temp = node.left;
node.left = node.right;
node.right = temp;
// 如果左右子树不为空加入到队列中
if(node.left != null) {
queue.push(node.left);
}
if(node.right != null) {
queue.push(node.right);
}
}
return root;
};