题目一 : 翻转二叉树
题目描述:226. 翻转二叉树 - 力扣(LeetCode)
我的理解:
是不是要储存一下遍历到的节点?然后感觉对于每一个节点的变化都很大,我想可不可以先用一个双端队列储存每层的节点,然后再重新建立一颗树,感觉建立比移动和改变会更方便,只是可能会更加消耗内存,
惹惹惹,大家先不要相信我,好像其实这样很复杂也很慢,确实可以直接交换
我漏掉了一个细节,就是我以为是,拿最后一层举例啊,就是我以为是,不是最右边的换到了最前面嘛,我就以为是一口气移动过去的,哎呀,这样就忽略了一些节点的关联性,找到递归的思想,想一想是不是每一层都做了同样的事,我的思路就感觉还是停留在如何能在我可预见的一个情况下,解决这个问题,导致思路很窄,很局限,没有全局性
题目分析:
=====其实仔细思考一下,每一个节点就和它的旁边交换一下就可以了=======
上面那一点说的也不对,确实是和旁边的交换,但是第一个咋办,那不就不能交换了,而且还有一点就是如何拿到旁边的节点呢,所以我还是没总结对
对的应该是每一个节点把它的两个子节点交换位置!!!!
所以最后就是写一个遍历函数的框架 ,然后把每一个节点的左右子节点进行交换,但是如果是空节点,就返回
自己的思路:
看看以后自己能否把它补完,其实感觉这个方法也不是不行,就是慢了点
java
public TreeNode invertTree(TreeNode root) {
if(root==null)
return root;
List<TreeNode> deque =new LinkedList<>();
List<TreeNode> newdeque =new LinkedList<>();
//两个队列,一个存,一个取
TreeNode newRoot =new TreeNode(root.val,root.left,root.right);
//外层循环干什么-----
//感觉可以变成一个建树的函数,一个拿到那些点建树,一个拿到那些点建树
while(){
int count=deque.size();
while(count--){
newdeque.add(deque.pollLast());
}
}
}
题解:
java
/**
* 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) {
traverse(root);
return root;
}
public static void traverse(TreeNode root){
if(root==null)
return;
TreeNode temp;
temp=root.right;
root.right =root.left;
root.left=temp;
traverse(root.left);
traverse(root.right);
}
}
题目二: 二叉树的直径
题目描述: 543. 二叉树的直径 - 力扣(LeetCode)
我的理解:
什么时候取最大??我觉得某个结点的左边深度最大的加上右边深度最大的就是最大的,感觉有点像我下边画的这样的:
所以我有点想模仿当时上一次写那个求最大深度的那个题目
自己的思路:
java
class Solution {
public int diameterOfBinaryTree(TreeNode root) {
traverse(root);
}
public static void traverse(TreeNode root){
if(root ==null){
return;
//惹,咋表示左右两边的???
ans=
}
depth++;
traverse(root.left);
traverse(root.right);
depth--;
}
}
写到这里不知道怎么表示左右两边了哈。。。
!!!!注意这一个注意事项: 配合外部变量 遍历的思维
题目分析:
啊哈!自己的思路终于对了,素的,就是一个结点的左右子树的最大深度之和!!
所以关键就是代码咋写。。
题解:
java
/**
* 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 static int MaxDiameter =0;
public int diameterOfBinaryTree(TreeNode root) {
MaxDiameter=0;
traverse(root);
return MaxDiameter;
}
//遍历二叉树
public static void traverse(TreeNode root){
if(root ==null){
return;
//惹,咋表示左右两边的???
}
//对每一个结点计算直径
int leftMax =maxDepth(root.left);
int rightMax =maxDepth(root.right);
int myDiameter =leftMax +rightMax;
//更新全局最大值
MaxDiameter =Math.max(MaxDiameter,myDiameter);
traverse(root.left);
traverse(root.right);
}
//计算二叉树的最大深度
public static int maxDepth(TreeNode root){
if(root ==null){
return 0;
}
int leftMax =maxDepth(root.left);
int rightMax =maxDepth(root.right);
return 1+Math.max(leftMax,rightMax);
}
}
其实我感觉自己的把每一个不同的功能分开的能力还不是很强,阿巴,也就是说前序的时候就计算最大值,但是感觉好像进行了两次递归?maxDepth() ,和traverse() 这里好像都用了递归