持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第27天,点击查看活动详情
前言
算法的重要性不言而喻!区分度高!
现在学习的门槛低了,只有能上网每个人都可以学编程!培训班6个月就可以培养出来能干活的人,你怎么从这些人中脱颖而出?没错!就是学算法,学一些底层和基础的东西。
说的功利点是为了竞争,卷死对手。真心话说就是能提高自己的基础能力,为技术可持续发展做好充分的准备!!!
提前入门学习书籍:CPrimerPlus、大话数据结构
刷题网站
我是按照代码随想录提供的刷题顺序进行刷题的,大家也可以去刷leetcode最热200道,都可以
刷题嘛,最重要的就是坚持了!!!
画图软件
OneNote
这个要经常用,遇见不懂的流程的话就拿它画一画!
笔记软件
Typoral
题目
解析
思路:
前后序遍历都可以
中序不行,因为先左孩子交换孩子,再根交换孩子(做完后,右孩子已经变成了原来的左孩子),再右孩子交换孩子(此时其实是对原来的左孩子做交换)
这道题很容器想到递归,因为首先是根节点反转,之后根节点左边反转,根节点右边反转
那么这个反转其实就可以抽取出来!然后节点分别调用它们不就可以了!
但是要注意的点这种方式遍历的时候不能用中序遍历,因为你首先左交换,之后换到右边,右边再换实际换的还是左边节点的交换
是不是非常的amazing呢?zhuan
我们来画图理解一下: 二叉树原始的样子,那怎么把他们翻转呢?
第一步如下: 先交换子节点
第二步如下:
在交换父节点,这样就完成了二叉树的翻转
好的,思路我们滤清了,那代码怎么写呢?
还是先写一个二叉树的定义
Definition for a binary tree node.
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {}
TreeNode(int val) { this.val = val; }
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
完成代码如下: 意思就是先交换根节点下左节点的值,然后在交换右节点的值,最后交换根节点两边的值,这样就完成了二叉树的翻转
class Solution {
public TreeNode invertTree(TreeNode root) {
if(root == null){
return null;
}
invertTree(root.left);
invertTree(root.right);
swapChildren(root);
return root;
}
public void swapChildren(TreeNode root){
TreeNode tmp = root.left;
root.left = root.right;
root.right = tmp
}
}