- 博主简介:努力学习的22级计算机科学与技术本科生一枚🌸
- 博主主页: @是瑶瑶子啦
- 每日一言🌼: 所谓自由,不是随心所欲,而是自我主宰。——康德
目录
- 一、前言
- 二、刷题
- 1、翻转二叉树
- 2、二叉树的层序遍历✨
- 3、 二叉树展开为链表
一、前言
二叉树的刷题思路和纲领在这篇:【数据结构】二叉树篇| 纲领&思路01+刷题已经给出,这篇主要还是刷题,进行巩固
🍊 不过新增了“二叉树的层序遍历”(第二题),我个人暂时认为它不属于前面所讲纲领两个模式的任何一个,所以我将它单独提出来。
二、刷题
1、翻转二叉树
🔗226. 翻转二叉树
- 👧🏻思路:分解成子问题,根节点的左子树 = 根节点右子树翻转后;根节点的右子树 = 根节点右子树翻转后
- 🙇🏻♀️代码:
// 定义:将以 root 为根的这棵二叉树翻转,返回翻转后的二叉树的根节点
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;
// 和定义逻辑自恰:以 root 为根的这棵二叉树已经被翻转,返回 root
return root;
}
2、二叉树的层序遍历✨
🔗116. 填充每个节点的下一个右侧节点指针
public Node connect(Node root) {
if(root == null){
return root;
}
Queue<Node> q = new LinkedList<>();//创建一个辅助队列
q.offer(root);
while(!q.isEmpty()){
int size = q.size();//当前层次的节点个数
for(int i = 0; i < size; size--){//遍历这一层节点
Node cur = q.poll();
//连接next节点
if(i < size-1){
cur.next = q.peek();
}
if(cur.left!= null){
q.offer(cur.left);
}
if(cur.right!=null){
q.offer(cur.right);
}
}
}
return root;
}
3、 二叉树展开为链表
🔗114. 二叉树展开为链表
- 👧🏻思路:后续遍历!在后序位置进行连接即可
至于如何把 root 的左右子树拉平,不用你操心,flatten 函数的定义就是这样,交给他做就行了。
public void flatten(TreeNode root) {
if(root == null){
return;
}
//1、先将左右子树拉平
flatten(root.left);
flatten(root.right);
/****后序遍历位置****/
// 左右子树已经被拉平成一条链表
TreeNode left = root.left;
TreeNode right = root.right;
//2进行连接,先把root和left连接成一个链表
root.left = null;
root.right = left;
//3、将原先的右子树接到当前右子树的末端
TreeNode p = root;
while(p.right!=null){
p = p.right;
}
p.right = right;
}
💐若有不懂的地方,欢迎随时在评论区or私信找瑶瑶子交流讨论🌺
-
Java岛冒险记【从小白到大佬之路】
-
LeetCode每日一题–进击大厂
-
Go语言核心编程
-
算法