zoukankan      html  css  js  c++  java
  • 二叉树相关

    BST:

    增:(插入)

         若当前的二叉查找树为空,则插入的元素为根节点,

         若插入的元素值小于根节点值,则将元素插入到左子树中,

         若插入的元素值不小于根节点值,则将元素插入到右子树中,

       递归上述过程,直到找到插入点为叶子节点

     

    查:

    给定一颗二叉查找树,查找某节点p的过程如下:

     将当前节点cur赋值为根节点root;

     若p的值小于当前节点cur的值,查找cur的左子树;

     若p的值不小于当前节点cur的值,查找cur的右子树;

     递归上述过程,直到cur的值等于p的值或者cur为空;

     当然,若节点是结构体,注意定义“小于”“不小于”“等于”的具体函数。

    删: 450. Delete Node in a BST

    记待删除的节点为p,分三种情况进行处理:

     p为叶子节点

      p为叶子节点,直接删除该节点,再修改p的父节点的指针

     p为单支节点

      若p为单支节点(即只有左子树或右子树),则将p的子树与p的父亲节点相连,删除p即可

     p的左子树和右子树均不空

      若p的左子树和右子树均不空,则找到p的直接后继d(p的右孩子的最左子孙),因为d一定没有左子树,所以使用删除单支节点的方法:

    删除d,并让d的父亲节点dp成为d的右子树的父亲节点;同时,用d的值代替p的值;

      对偶的,可以找到p的直接前驱x(p的左孩子的最右子孙),x一定没有右子树,所以可以删除x,并让x的父亲节点成为x的左子树的父亲节点。

      

     二叉树树的遍历 递归or非递归

    push是第一次访问

    pop是第二次访问 

     

     1 class Solution {
     2     public List<Integer> preorderTraversal(TreeNode root) {
     3         Stack<TreeNode> s =  new Stack<TreeNode>();
     4         List<Integer> res = new ArrayList<Integer>();
     5         while(root!=null||!s.isEmpty()){
     6             while(root!=null){
     7                 s.push(root);
     8                 res.add(root.val);
     9                 root = root.left;
    10             }
    11             if(!s.isEmpty()){
    12                 root = s.pop();
    13                 root = root.right;
    14             }
    15         }
    16         return res;
    17     }
    18 }
     1 class Solution {
     2     public List<Integer> postorderTraversal(TreeNode root) {
     3         Stack<TreeNode> s =  new Stack<TreeNode>();
     4         List<Integer> res = new ArrayList<Integer>();
     5         while(root!=null||!s.isEmpty()){
     6             while(root!=null){
     7                 s.push(root);
     8                 res.add(0,root.val);
     9                 root = root.right;
    10             }
    11             
    12             if(!s.isEmpty()){
    13                 root = s.pop();
    14                 root = root.left;
    15             }
    16         }
    17         return res;
    18     }
    19 }

     

    前序遍历  : http://www.cnblogs.com/zle1992/p/8387902.html

    中序遍历 :http://www.cnblogs.com/zle1992/p/8342423.html

    后序遍历 :http://www.cnblogs.com/zle1992/p/8458643.html

    根据前序中序,构造二叉树 http://www.cnblogs.com/zle1992/p/8360249.html

    根据中序后序,构造二叉树 http://www.cnblogs.com/zle1992/p/8379513.html

     

    层序遍历(利用queue):http://www.cnblogs.com/zle1992/p/8350435.html

                http://www.cnblogs.com/zle1992/p/8350511.html

                http://www.cnblogs.com/zle1992/p/8398387.html

     

     

    59按之字形顺序打印二叉树

    60把二叉树打印成多行

     

     

    二叉树相关:

        61序列化二叉树

        57二叉树的下一个结点

        58对称的二叉树  101. Symmetric Tree(判断二叉树是否对称)  

     

     

    平衡二叉树 Balanced Binary Tree(AVL树)

    这个方案很好的解决了二叉查找树退化成链表的问题,把插入,查找,删除的时间复杂度最好情况和最坏情况都维持在O(logN)。

     

     

  • 相关阅读:
    异常类
    设计模式
    java的参数传递
    meta 标签中 http-equiv 的作用
    导入CSV格式文件方法
    第四次博客作业-结对项目
    第九次作业-接口及接口回调
    第八次作业-继承
    软件工程第三次作业——关于软件质量保障初探
    Java第七次作业
  • 原文地址:https://www.cnblogs.com/zle1992/p/8458420.html
Copyright © 2011-2022 走看看