目录
2.substring() 可以看出是满足一系列合法条件的时候,就会返回一个新的字符串.

第一个循环找到开头的st下标.第二个循环找到结尾的.

这里注意,from就是左臂右开的

s.substring s = s.trim() math.abs
把元素从后往前压入栈中,如果遇到空格,就用sb接收弹出来的值,
如果遇到第一个元素且不是空格还要再次判断一次.



没有考虑最后一个单词的情况就算考虑到了,也不能处理两个单词间有空格的情况


- class Solution {
- public String reverseWords(String s) {
- s=s.trim();//删除首尾空格 是返回一个新的字符串
- StringBuilder sb=new StringBuilder();
- int j=s.length()-1;int i=j;
- while(i>=0){
- while(i>=0&&s.charAt(i)!=' ') i--;//找空格
- sb.append(s.substring(i+1,j+1)+' '); //拼接在一起加上空格
- while(i>=0&&s.charAt(i)==' ') i--;//跳过单词间的空格
- j=i;
-
- }
-
- return sb.toString().trim();//处理最后一个单词
-
- }
- }
思路:不仅树节点结构相同也就是不能有一个为null有一个不为null.而且要求两个值要相同

- public boolean isSameTree(TreeNode p, TreeNode q) {
- if(p == null && q !=null ||p!=null&&q==null) return false;
- if(p==null&&q==null)return true;
- if(p.val==q.val) return true;
- //如果这样的话,假设两个相同,就没办法往下走了,就永远递归不了,直接返回true
- //必须要求都满足条件,再往下递归
- return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
- }
此方法耦合度高且可读性差
- class Solution {
- public boolean isSameTree(TreeNode p, TreeNode q) {
- if(p!=null&&q!=null){
- if(p.val!=q.val){
- return false;
- }
- }else if(p==null&&q==null){
- return true;
-
- }else{
- return false;
- }
- boolean b= isSameTree(p.left,q.left);
- if(b){
- b=isSameTree(p.right,q.right);
- }
- return b;
-
-
- }
- }
思路:要么就判断是否是相同的树,或者是他的左子树或者右子树是否相同,然后继续递归.

- class Solution {
- public boolean isSameTree(TreeNode p, TreeNode q){
- if(p==null&&q!=null||p!=null&&q==null) return false;
- if(p==null&&q==null) return true;
- if(p.val!=q.val) return false;
- return isSameTree(p.left,q.left)&&isSameTree(p.right,q.right);
- }
- public boolean isSubtree(TreeNode root, TreeNode subRoot) {
- if(root==null) return false;
- if(isSameTree(root,subRoot)) return true;
- return isSubtree(root.left,subRoot)||isSubtree(root.right,subRoot);
- }
- }


思路:如果是平衡二叉树那么每颗子树都是平衡二叉树,所以又要递归
- class Solution {
- public int treeHeight(TreeNode root){
- if(root==null) return 0;
- int heightLeft=treeHeight(root.left);
- int heightright=treeHeight(root.right);
- return heightLeft>heightright?heightLeft+1:heightright+1;
-
- }
- public boolean isBalanced(TreeNode root) {
- if(root==null) return true;
- int heightLeft=treeHeight(root.left);
- int heightright=treeHeight(root.right);
- if(heightLeft-heightright>1){
- return false;
- }
- if(heightright-heightLeft>1){
- return false;
- }//如果是true,总长度满足,剩下的分支就不会管了.就不会往下递归了
- //走到这一行要求左右差距不超过1
- return isBalanced(root.left)&&isBalanced(root.right);
- }
- }
因为在求树的高度的时候就已经把每个节点递归了
然后再平衡树的方法的时候又把每个节点再拿进去求所以复杂度就是n*n
- class Solution {
- public int treeHeight(TreeNode root){
- if(root==null) return 0;
- int heightLeft=treeHeight(root.left);
- int heightright=treeHeight(root.right);
- if(heightLeft>=0&&heightright>=0&&Math.abs(heightLeft-heightright)<=1){
- return Math.max(heightLeft,heightright)+1;
- }else{
- return -1;
- }
-
-
- }
- public boolean isBalanced(TreeNode root) {
- if(root==null) return true;
- return treeHeight(root)>=0;
-
-
- }
- }

- class TreeNode {
- TreeNode left;
- TreeNode right;
- char val;
- TreeNode(char val) {
- this.val = val;
- }
- }
-
- // 注意类名必须为 Main, 不要有任何 package xxx 信息
- public class Main {
- public static void inorder(TreeNode root){
- if(root==null) return;
- inorder(root.left);
- System.out.print(root.val+" ");
- inorder(root.right);
-
- }
- public static void main(String[] args) {
- Scanner in = new Scanner(System.in);
- // 注意 hasNext 和 hasNextLine 的区别
- while (in.hasNextLine()) { // 注意 while 处理多个 case
- String str = in.nextLine();
- TreeNode root = createTree(str);
- inorder(root);
- System.out.println();
- i=0;
- }
-
- }
- public static int i=0;
- public static TreeNode createTree(String str) {
- char ch=str.charAt(i);
- TreeNode root=null;
- if(ch!='#'){
- root=new TreeNode(ch);
- i++;
- root.left=createTree(str);
- root.right=createTree(str);
- }else{
- i++;
- }
- return root;
- }
-
- }
也就是子树的左节点和另一棵树的右节点分别判断,也就是把判断两棵树是否相同改编一下就好
- class Solution {
- public boolean issame(TreeNode p,TreeNode q){
- if(p!=null&&q==null) return false;
- if(p==null&&q!=null) return false;
- if(p==null&&q==null) return true;
- if(p.val!=q.val) return false;
- return issame(p.left,q.right)&&issame(p.right,q.left);
-
- }
- public boolean isSymmetric(TreeNode root) {
- if(root==null) return true;
- return issame(root.left,root.right);
-
- }
- }