👨💻博客主页:@花无缺
欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
本文由 花无缺 原创收录于专栏 【力扣题解】
【力扣题解】P226-翻转二叉树-Java题解
🌏题目描述
给你一棵二叉树的根节点 root
,翻转这棵二叉树,并返回其根节点。
示例 1:
输入:root = [4,2,7,1,3,6,9]
输出:[4,7,2,9,6,3,1]
示例 2:
输入:root = [2,1,3]
输出:[2,3,1]
示例 3:
输入:root = []
输出:[]
提示:
- 树中节点数目范围在
[0, 100]
内 -100 <= Node.val <= 100
💡题解
递归法:
public TreeNode invertTree(TreeNode root) {
// 节点为空, 递归终止
if (root == null) {
return root;
}
// 交换当前节点的左右子树
TreeNode node = root.left;
root.left = root.right;
root.right = node;
// 递归翻转左子树
invertTree(root.left);
// 递归翻转右子树
invertTree(root.right);
// 返回递归后的二叉树
return root;
}
时间复杂度:O(n)
,需要访问树的所有节点,节点数为 n。
迭代法:
// 前序遍历迭代
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return root;
}
Deque<TreeNode> stack = new LinkedList<>();
stack.offerLast(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pollFirst();
// 交换当前节点的左右子树
TreeNode temp = node.left;
node.left = node.right;
node.right = temp;
if (node.right != null) {
stack.offerLast(node.right);
}
if (node.left != null) {
stack.offerLast(node.left);
}
}
return root;
}
时间复杂度:O(n)
,需要访问树的所有节点,节点数为 n。
🌏总结
这道题使用递归很简单,就是递归的交换节点的左右子树,最后返回根节点,就可以完成二叉树的翻转。
那么怎么使用迭代来做呢,其实使用前序、中序、后序和层次遍历的迭代法都可以做这道题,在迭代法中遍历到一个节点的时候,就交换这个节点的左右子树,这样就达到了翻转整个二叉树的效果。这里我采用的是前序遍历迭代法,当栈顶节点出栈时,就交换它的左右子树,当访问完所有节点后,整个二叉树就完成了翻转。
🌸欢迎
关注
我的博客:花无缺-每一个不曾起舞的日子都是对生命的辜负~
🍻一起进步-刷题专栏:【力扣题解】
🥇往期精彩好文:
📢【CSS选择器全解指南】
📢【HTML万字详解】
你们的点赞👍 收藏⭐ 留言📝 关注✅
是我持续创作,输出优质内容
的最大动力!
谢谢!