数据结构--树(一)

      说起数据结构与算法,这让我想起了大学的那段青葱岁月,那时候的我偶尔还会捧起严蔚敏老师的那本《数据结构》,沉醉于这些精巧的设计:栈,队列,树,堆,图。。。那时候的我还能写出冒泡,快排,堆排序。。。

      之前出去面试要我写一个判断一棵树是不是二叉搜索树,我甚至是拒绝的,总觉得面试官太过装逼,这些东西好久没用到,你让我来个二叉搜索,我得先问你:什么是二叉搜索树?虽然脸上笑嘻嘻,实则心里mmp。后来,我慢慢意识到这是有道理的,很多框架底层实现还是挺经常用到这些个数据结构,一方面是考察你技术的基础和深度,一方面也能筛选个思维逻辑比较好的同学,允许你忘记概念,在面试官的引导下,你能不能做出来。

      先来说说一些树的具体应用:

      1. AVL树:windows对进程地址空间的管理

      2. 红黑树:map和set底层都是用的红黑树实现的;jdk1.8的hashMap底层优化也用到红黑树/B树

      3. B/B+树:磁盘文件组织数据索引和数据库索引 (“你心里没有点B树?”也算是个应用)

      4. Trie树(字典树):统计大量字符串和排序,字符串前缀匹配

      。。。


1. 二叉搜索树(Binary Sort Tree)



BTS具有如下性质:

1) 若左子树不空,则左子树上所有结点的值均小于它的根结点的值;

2) 若右子树不空,则右子树上所有结点的值均大于或等于它的根结点的值;

3) 左、右子树也分别为二叉排序树;

4) 没有键值相等的节点。


节点表示:
public class Node {  

    public int value;   
    public Node leftChild;  
    public Node rightChild;  
 
}

前序,中序,后序遍历:

    //前序遍历  
    public void preorder_iterator(Node node){  
        System.out.print(node.value + " ");  
        if(node.leftChild != null)  
            this.preorder_iterator(node.leftChild);  
        if(node.rightChild != null)  
            this.preorder_iterator(node.rightChild);  
    }  
       
    //中序遍历二叉搜索树将会得到所有数据项的有序数列  
    public void inorder_iterator(Node node){  
        if(node.leftChild != null)  
            this.inorder_iterator(node.leftChild);  
        System.out.print(node.value + " ");  
        if(node.rightChild != null)  
            this.inorder_iterator(node.rightChild);  
    }  
      
    //后序遍历  
    public void postorder_iterator(Node node){  
        if(node.leftChild != null)  
            this.postorder_iterator(node.leftChild);  
        if(node.rightChild != null)   
            this.postorder_iterator(node.rightChild);  
        System.out.print(node.value + " ");  
    }  

判断一棵树是否为二叉搜索树:

public class BSTChecker {  
    private static int lastVisit = 0;  
  
    public static boolean isBST(Node root) {  
        if(root == null) return true;  
  
        boolean judgeLeft = isBST(root.left); // 先判断左子树  
  
        if(root.value >= lastVisit && judgeLeft) { // 当前节点比上次访问的数值要大  
            lastVisit = root.value;  
        } else {  
            return false;  
        }  
  
        boolean judgeRight = isBST(root.right); // 后判断右子树  
  
        return judgeRight;  
    }  
}  


2. AVL树

    当BTS的复杂度是O(logn), 这是在比较理想的状态下,如果一个数列是有序的,此时的树就退化成线性的,像链表这样,复杂度就为O(n), 这时候,就需要对这棵树进行一个平衡!

     


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值