zoukankan      html  css  js  c++  java
  • 完全二叉树 数组存储 层次构造

    对于完全二叉树,如果将其中的元素按层次遍历顺序存放入一个一维数组中:
    设数组大小为n(节点数为n),节点标号(key)为数组下标i,即0,1,2,3,4,,,
    那么:
    1.完全二叉树的高度为: ceil(log2(n+1))
    2.i = 0: 根节点,root,无父节点。
    i >= 1: 父节点为 floor((i-1)/2);
    3.若2*i<n-1: 节点i的左子女为 2*i + 1
    若2*i<n-2: 节点i的右子女为 2*i + 2
    4.若节点编号 i 为奇数,i != 1, 它处于右兄弟位置,则它的左兄弟为节点 i-1
    5.若节点编号 i 为偶数,i != 1, 它处于左兄弟位置,则它的右兄弟为节点 i+1
    6.节点i所在的层次为 floor(log2(i-1))+1;

    Java实现:
     1  
     2 /**
     3  * Created by XuTao on 2018/11/18 11:54
     4  * 完全二叉树:
     5  * 用数组按层次序排列
     6  *
     7  */
     8 
     9  
    10 public class BT {
    11     private Node root;
    12     private int [] data;
    13     public BT_ArrayStore(int []a){
    14         this.data =a;
    15         this.root = create(a,0);
    16     }
    17 
    18     public int getHeight(){
    19         return (int)Math.floor(Math.log(data.length)/Math.log(2))+1;  //这里涉及到Math,易错
    20     }
    21     public int getFather(int i){
    22         if (i==0) return 0;
    23         return (int)(Math.floor((i-1)/2));
    24     }
    25 
    26     public int getLeft(int i){
    27         return 2*i+1;
    28     }
    29     public int getRight(int i){
    30         return 2*i+2;
    31     }
    32 
    33     public int getBrother(int i){
    34         if (i%2==0)
    35             return i-1;
    36         else return i+1;
    37     }
    38     public int  getLevel(int i){
    39         return (int)(Math.floor(Math.log(i-1)/Math.log(2)))+1;
    40     }
    41 
    42 
    43     private Node create(int[] arr, int index) {
    44         if (index >= arr.length)       // 可以不需要,但是所有的值必须要写满,任一个#都要写,不然会越界
    45             return null;
    46         else if (String.valueOf(arr[index]).equals("#")||String.valueOf(arr[index]).equals("*")) {
    47             return null;
    48         } else {
    49             Node node = new Node(arr[index]);
    50             node.left = create(arr, 2 * index + 1);
    51             node.right  = create(arr, 2 * index + 2);
    52             return node;
    53         }
    54     }
    55 
    56     class Node{
    57         private Node left;
    58         private Node right;
    59         private int data;
    60         public Node(int data){
    61             this.data = data;
    62         }
    63     }
    64 
    65     public static void main(String[] args) {
    66         int []a = new int[]{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
    67         BT bt = new BT (a);
    68         System.out.println(bt.getHeight());
    69         System.out.println(bt.getFather(14));
    70         System.out.println(bt.getLeft(4));
    71         System.out.println(bt.getRight(5));
    72         System.out.println(bt.getBrother(5));
    73         System.out.println(bt.getLevel(5));
    74 
    75     }
    76 }

    如果是1---n, 那么上述公式每个i加1即可。

  • 相关阅读:
    Atitit. 查找linux 项目源码位置
    Atitit.用户权限服务 登录退出功能
    Atitit.js javascript的rpc框架选型
    Atitit.php  nginx页面空白 并返回500的解决
    Atitit .linux 取回root 密码q99
    Atitit.报名模块的管理
    Atitit.基于时间戳的农历日历历法日期计算
    Atitit.excel导出 功能解决方案 php java C#.net版总集合.doc
    我的博客开通了
    (转)列举ASP.NET 页面之间传递值的几种方式
  • 原文地址:https://www.cnblogs.com/XT-xutao/p/9977769.html
Copyright © 2011-2022 走看看