力扣labuladong一刷day29天二叉树
文章目录
-
-
- 力扣labuladong一刷day29天二叉树
- [一、226. 翻转二叉树](#一、226. 翻转二叉树)
- [二、116. 填充每个节点的下一个右侧节点指针](#二、116. 填充每个节点的下一个右侧节点指针)
- [三、114. 二叉树展开为链表](#三、114. 二叉树展开为链表)
-
一、226. 翻转二叉树
题目链接:https://leetcode.cn/problems/invert-binary-tree/
思路:翻转二叉树可以视为分解任务,即翻转单个节点的左右子树,放在尾部后序遍历即可,如果采用遍历的思路,就使用前序遍历进行翻转。
java
class Solution {
public TreeNode invertTree(TreeNode root) {
if (root == null) {
return null;
}
TreeNode left = invertTree(root.left);
TreeNode right = invertTree(root.right);
root.left = right;
root.right = left;
return root;
}
}
java
class Solution {
public TreeNode invertTree(TreeNode root) {
traverse(root);
return root;
}
void traverse(TreeNode root) {
if (root == null) {
return;
}
TreeNode temp = root.left;
root.left = root.right;
root.right = temp;
traverse(root.left);
traverse(root.right);
}
}
二、116. 填充每个节点的下一个右侧节点指针
题目链接:https://leetcode.cn/problems/populating-next-right-pointers-in-each-node/
思路:本题是一个满二叉树,然后想让每一个节点的next指向它右边的节点,那么采用遍历的思路每进入一个节点我们就要连接,那么不在一个父节点下的节点间的该如何处理呢,其实就是把这两个也看做是父节点下的节点,转化为三叉树。
java
class Solution {
public Node connect(Node root) {
if (root == null) return null;
traverse(root.left, root.right);
return root;
}
void traverse(Node root1, Node root2) {
if (root1 == null || root2 == null) return;
root1.next = root2;
traverse(root1.left, root1.right);
traverse(root1.right, root2.left);
traverse(root2.left, root2.right);
}
}
三、114. 二叉树展开为链表
题目链接:https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/
思路:本题要求O(1)复杂度,无法前序遍历来做,既然遍历不行就试试分解法,发现分解法是可以的,root.left = null; root.right=left。那么right如何拼接到新的右子树上去呢,应该频道新的右子树的尾部,这是一个要注意的点。
java
class Solution {
public void flatten(TreeNode root) {
if (root == null) return;
flatten(root.left);
flatten(root.right);
TreeNode left = root.left;
TreeNode right = root.right;
root.left = null;
root.right = left;
TreeNode p = root;
while (p.right != null) p = p.right;
p.right = right;
}
}