Java数据结构-Tree相关

1:树

树:是一种一对多的数据结构,采用链式存储,是n个结点的有限集,如果n=0则是一个空树,任意一个非空树只有一个根节点。

在这里插入图片描述

其中,A为根(root),A,B,D…称为结点:

节点包含了值和一些信息,有两种表示方法,其中孩子表示法用的较多

在这里插入图片描述

树的遍历:以上图为例

  1. 前序遍历:根节点->左子树->右子树 A B D C E F
  2. 中序遍历:左子树->根节点->右子树 D B A E C F
  3. 后序遍历:左子树->右子树->根节点 D B E F C A
  4. 层序遍历:从左到右,一层一层走完整个树 A B C D E F
>     //前序遍历
>     void perOrder(TreeNode root){
>         if(root==null){
>             return;
>         }
>         System.out.print(root.val+"");
>         perOrder(root.left);
>         perOrder(root.right);
>     }
>     //中序遍历
>     void midOrder(TreeNode root){
>         if(root==null){
>             return;
>         }
>         midOrder(root.left);
>         System.out.print(root.val+" ");
>         midOrder(root.right);
>     }
>     //后序遍历
>     void postOrder(TreeNode root){
>         if(root==null){
>             return;
>         }
>         postOrder(root.left);
>         postOrder(root.right);
>         System.out.print(root.val+" ");
>     }
>     //层序遍历借助队列完成
>     public void leveOrder(TreeNode root){
> 
>         Queue<TreeNode> queue=new LinkedList<>();
> 
>         if(root!=null){
>             queue.offer(root);
>         }
> 
> 
>         while (!queue.isEmpty()){
>             TreeNode cur=queue.poll();
>             System.out.print(cur.val+" ");
> 
>             if(cur.left!=null){
>                 queue.offer(cur.left);
>             }
>             if(cur.right!=null){
>                 queue.offer(cur.right);
>             }
>         }
> 
>     }
> 

2:二叉树

二叉树:二叉树是n (n>=0) 个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根节点和两棵互不相交的,分别称为根节点的左子树和右子树的二叉树组成。

二叉树的一些特征:

  • 若规定根节点的层数为1,则一颗非空二叉树的第i层上最多节点个数为 2 i − 1 ( i > 0 ) 2^{i-1}(i>0) 2i1(i>0)
  • 若规定只有根节点的二叉树的深度为1,则深度为k的二叉树最大结点数为 2 k − 1 ( k ≥ 0 ) 2^k-1(k\geq0) 2k1(k0)
  • 对任何一个二叉树,如果叶节点的个数为 n 0 n_0 n0,度为2的非叶结点个数为 n 2 n_2 n2,则有 n 0 = n 2 + 1 n_0=n_2+1 n0=n2+1
  • 具有n个结点的完全二叉树的深度k为 k = l o g 2 n + 1 ( 向 上 取 整 ) k=log_2^{n+1}(向上取整) k=log2n+1()
  • 对于具有n个结点的完全二叉树,如果按照从上至下从左至右的顺序对所有节点从0开始编号,则对于序号为i的节点有:
    • i > 0 i>0 i>0,双亲序号: ( i − 1 ) / 2 (i-1)/2 (i1)/2,若 i = 0 i=0 i=0,i为根节点编号,无双亲结点
    • 2 i + 1 < n 2i+1<n 2i+1<n,左孩子序号: 2 i + 1 2i+1 2i+1,否则无左孩子
    • 2 i + 2 < n 2i+2<n 2i+2<n,右孩子序号: 2 i + 2 2i+2 2i+2,否则无右孩子

完全二叉树:对于一棵具有n个结点的二叉树按层序编号,如果编号为i(1<=i<=n)的结点与同样深度的满二叉树中编号为i的结点在二叉树中位置完全相同,则这颗二叉树称为完全二叉树。完全二叉树在缺失时,只能缺失右结点。

3:完全二叉树

判断当前二叉树是不是完全二叉树:
借助队列完成判断,从根节点出发,入队,队列不为空则出队列,并判断该结点有没有左右孩子,有则放进队列,直到出队列的元素为null,跳出循环。再判断队列中的元素是否都为null,都为null则是完全二叉树。

//判断当前树是不是完全二叉树
    boolean isCompleteTree(TreeNode root){
        int size=0;
        Queue<TreeNode> queue=new LinkedList<>();
        if(root!=null){
            queue.offer(root);
            size++;
        }

        while (! queue.isEmpty()){
            TreeNode cur = queue.poll();
            if(cur!=null){
                queue.offer(cur.left);
                size++;
                queue.offer(cur.right);
                size++;
            }else {
                break;
            }
        }

        while (!queue.isEmpty()){
            TreeNode cur=queue.peek();
            if(cur!=null){
                return false;
            }else {
                queue.poll();
            }
        }
        return true;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值