基础算法递归

    科技2024-11-23  20

    LinkedList(链表)是特殊化的Tree Tree是特殊化的Grape(图)

    二叉搜索树的复杂度一般是O(log n)增加叶子 搜索叶子 删除叶子都是O(log n)

    二叉树的遍历:前序:根左右 中序:左根右 后续:左右根

    树的面试题的解法一般都是递归

    树的定义(背下来)

    public class TreeNode{

    int

    val;

    TreeNode

    left;

    TreeNode

    right;

    TreeNode(int

    x){

    val=x;

    }

    }

    树节点的定义:(背下来)

    public class TreeNode{

    public

    int val;

    public

    TreeNode left,right;

    public

    TreeNode(int val){

    this.val=val; this.left=null; this.right=null;

    }

    }

    二叉树的中序遍历(用递归法来做) O(1)

    class Solution{

    public

    List inorderTraversal(TreeNode root){ root是左中右三个节点

    List<Integer>

    res=new ArrayList<>();

    if(root!=null) inorder(root,res); 节点不是空的 就带上一个空的res扔给inorder return

    res;

    }

    public

    void inorder(TreeNode root,List res){

    if(root.left!=null) inorder(root.left,root); inorder方法内的规则就是正常三种顺序遍历的规则 res.add(root.val); if(root.right!=null) inorder(root.right,res)

    }

    }

    递归的中心结构:(java代码实现  要背下来)

    public void recur(int level,int param){

    if(level>MAX_LEVEL){  return;}  1.recursion terminator 递归终结条件

    process(level,param);  2.process logic  in  current  level 处理当前层逻辑

    recur(level:level+1,newParam);  3.drill  down 下探到下一层

    4.reverse the current  level  status  if  needed清理当前层

    }

    括号生成(递归法)

    class Sulution{

    private List res;

    public List generateparenthesis(int n){

    res=new ArrayList();

    _generate(0,0,n,""); 0是左右括号初始个数 n是输入几个数字 空集合

    return res;

    }

    private void _generate(int left,int right,int n,String s){

    if(leftn&&rightn){ res.add(s);  return res; }  当左右括号都用完n的次数时  加入左右括号 到集合res

    if(left<n) _genarate (left+1,right,n,s+"(" );  如果左括号不够n  那就加左括号

    if(left<right) _generate(left,right+1,n,s+")");  右括号没有左面的多  就加右括号

    }

    }

    Processed: 0.010, SQL: 8