🔥 个人主页: 黑洞晓威
😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害
114. 二叉树展开为链表
给你二叉树的根结点 root
,请你将它展开为一个单链表:
- 展开后的单链表应该同样使用
TreeNode
,其中right
子指针指向链表中下一个结点,而左子指针始终为null
。 - 展开后的单链表应该与二叉树 先序遍历 顺序相同。
解题思路
- 找到当前节点的左子树的最右边节点,将当前节点的右子树挂在这个最右边节点的右孩子上。
- 将当前节点的左子树变为右子树。
- 将当前节点的左孩子设为null,继续处理右子树。
- 递归处理每个节点,直到整棵树都被展开为链表。
代码实现
class Solution {
public void flatten(TreeNode root) {
if (root == null) {
return;
}
while (root != null) {
if (root.left != null) {
TreeNode rightmost = root.left;
while (rightmost.right != null) {
rightmost = rightmost.right;
}
rightmost.right = root.right;
root.right = root.left;
root.left = null;
}
root = root.right;
}
}
}
199. 二叉树的右视图
给定一个二叉树的 根节点 root
,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
解题思路
- 进行层序遍历,每层遍历完后,取当前层最后一个节点的值加入结果列表中。
- 使用队列来进行层序遍历,每层遍历完后,更新结果列表的值。
代码实现
class Solution {
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new ArrayList<>();
if (root == null) {
return result;
}
Queue<TreeNode> queue = new LinkedList<>();
queue.offer(root);
while (!queue.isEmpty()) {
int size = queue.size();
for (int i = 0; i < size; i++) {
TreeNode node = queue.poll();
if (i == size - 1) {
result.add(node.val);
}
if (node.left != null) {
queue.offer(node.left);
}
if (node.right != null) {
queue.offer(node.right);
}
}
}
return result;
}
}