leetcode 150道题 计划花两个月时候刷完,今天(第三十一天)完成了2道(65-66)150:
65.(106. 从中序与后序遍历序列构造二叉树)题目描述:
给定两个整数数组 inorder 和 postorder ,其中 inorder 是二叉树的中序遍历, postorder 是同一棵树的后序遍历,请你构造并返回这颗 二叉树 。
第一版(这个和昨天的给了中序和先序去构造二叉树差不多,先序《根左右》,后序《左右根》,还是递归)
class Solution {Map<Integer,Integer> map=new HashMap();public TreeNode buildTree(int[] inorder, int[] postorder) {for(int i=0;i<inorder.length;i++){map.put(inorder[i],i);}return buildSubTree(inorder,0,inorder.length-1,postorder,0,postorder.length-1);}public TreeNode buildSubTree(int[] inorder, int iStart,int iEnd,int[] postorder,int pStart,int pEnd) {if(iStart>iEnd||pStart>pEnd){return null;}if(pStart==pEnd){return new TreeNode(postorder[pEnd]);}TreeNode root=new TreeNode(postorder[pEnd]);int rootIndex=map.get(postorder[pEnd]);int count=rootIndex-iStart;root.left=buildSubTree(inorder,iStart,rootIndex-1,postorder,pStart,pStart+count-1);root.right=buildSubTree(inorder,rootIndex+1,iEnd,postorder,pStart+count,pEnd-1);return root;}
}
66.(117. 填充每个节点的下一个右侧节点指针 II)题目描述:
给定一个二叉树:
struct Node {int val;Node *left;Node *right;Node *next;
}
填充它的每个 next 指针,让这个指针指向其下一个右侧节点。如果找不到下一个右侧节点,则将 next 指针设置为 NULL 。
初始状态下,所有 next 指针都被设置为 NULL 。
第一版(一看到这题就想到了层次遍历,所以第一版就层次遍历去实现的,只需要把层次遍历框架先写出来,然后再加上一个当前层的前一个节点的变量记录就可以了)
class Solution {public Node connect(Node root) {if(root==null)return root;Queue<Node> queue=new LinkedList();queue.offer(root);while(!queue.isEmpty()){int currNum=queue.size();Node preNode=null;while(currNum!=0){Node temp=queue.poll();if(temp.left!=null){if(preNode!=null){preNode.next=temp.left;}preNode=temp.left;queue.offer(temp.left);}if(temp.right!=null){if(preNode!=null){preNode.next=temp.right; }preNode=temp.right;queue.offer(temp.right);}currNum--;}}return root;}
}
第二版(看了解题,用上了题目中next指针,可以减少空间复杂度)
class Solution {public Node connect(Node root) {if(root==null){return root;}// 用 next 坐标串起来,先用上一层的把下一层的串好Node startNode=root;while(startNode!=null){Node preNode=null;// 记录下一层的 第一个节点Node lastNode=null;for(Node leftNode=startNode;leftNode!=null;leftNode=leftNode.next){if(leftNode.left!=null){if(lastNode==null){lastNode=leftNode.left;}if(preNode!=null){preNode.next=leftNode.left;}preNode=leftNode.left;}if(leftNode.right!=null){if(lastNode==null){lastNode=leftNode.right;}if(preNode!=null){preNode.next=leftNode.right;}preNode=leftNode.right;}}startNode=lastNode;}return root;}
}
这几天还在发懒中。。。不知道为啥。。还找了一个好看的动漫。。buff 拉满了。
第三十一天,加油,早日跳槽!!!