精品专区-精品自拍9-精品自拍三级乱伦-精品自拍视频-精品自拍视频曝光-精品自拍小视频

網站建設資訊

NEWS

網站建設資訊

判斷二叉樹是否為滿二叉樹-創新互聯

判斷二叉樹是否為滿二叉樹

作者:Grey

讓客戶滿意是我們工作的目標,不斷超越客戶的期望值來自于我們對這個行業的熱愛。我們立志把好的技術通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領域值得信任、有價值的長期合作伙伴,公司提供的服務項目有:空間域名、虛擬主機、營銷軟件、網站建設、城關網站維護、網站推廣。

原文地址:

博客園:判斷二叉樹是否為滿二叉樹

:判斷二叉樹是否為滿二叉樹

滿二叉樹定義

一個二叉樹,如果每一個層的結點數都達到大值,則這個二叉樹就是滿二叉樹。也就是說,如果一個二叉樹的層數為K,且結點總數是(2^k) -1,則它就是滿二叉樹。

方法1

使用公式,求二叉樹的層數 k, 結點數 n,如果滿足(2^k) -1 = n,則為滿二叉樹。

定義數據結構

public static class Info1 {public int height;
        public int nodes;

        public Info1(int h, int n) {height = h;
            nodes = n;
        }
    }

其中height表示二叉樹的層數,nodes表示二叉樹的結點個數。

定義遞歸函數

Info1 process1(Node head)

遞歸含義是:head 為頭的二叉樹的層數和點數都是多少,接下來就是 base case

即:head == null的時候,此時,height == 0nodes == 0

if (head == null) {return new Info1(0, 0);
        }

接下來是普遍情況

// 去左樹上收集信息
Info1 leftInfo = process1(head.left);
// 去右樹上收集信息
Info1 rightInfo = process1(head.right);
// 整合成 head 自己的信息
int height = Math.max(leftInfo.height, rightInfo.height) + 1;
int nodes = leftInfo.nodes + rightInfo.nodes + 1;
return new Info1(height, nodes);
方法2

定義如下數據結構

public static class Info2 {public boolean isFull;
        public int height;

        public Info2(boolean f, int h) {isFull = f;
            height = h;
        }
    }

其中isFull表示是否為滿二叉樹,height表示二叉樹的高度。

定義了這個數據結構后,可以梳理可能性,如果以head為頭的樹要符合滿二叉樹。則需要同時滿足下面三種情況

情況1:左樹是滿二叉樹

情況2:右樹是滿二叉樹;

情況3:左右樹的高度一樣。

定義遞歸函數

Info2 process2(Node head)

遞歸含義就是返回以head為頭的二叉樹Info2結構信息。

base case是

if (h == null) {return new Info2(true, 0);
        }

h == null默認是滿二叉樹,結點個數為0。

接下來是普遍情況,即去左右子樹收集相關信息,整合成以h為頭二叉樹的信息。

// 去左子樹收集相關信息
    Info2 leftInfo = process2(h.left);
    // 去右子樹收集相關信息
    Info2 rightInfo = process2(h.right);
    // 整合成 h 自己的新
    boolean isFull = leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height;
    int height = Math.max(leftInfo.height, rightInfo.height) + 1;
    return new Info2(isFull, height);

方法1 和 方法2 的時間復雜度都是O(n),即經過一次后序遍歷的時間復雜度。

兩種解法的完整代碼(含測試代碼)如下

public class Code_IsFull {public static class Node {public int value;
        public Node left;
        public Node right;

        public Node(int data) {this.value = data;
        }
    }

    // 第一種方法
    // 收集整棵樹的高度h,和節點數n
    // 只有滿二叉樹滿足 : 2 ^ h - 1 == n
    public static boolean isFull1(Node head) {if (head == null) {return true;
        }
        Info1 all = process1(head);
        return (1<< all.height) - 1 == all.nodes;
    }

    public static class Info1 {public int height;
        public int nodes;

        public Info1(int h, int n) {height = h;
            nodes = n;
        }
    }

    public static Info1 process1(Node head) {if (head == null) {return new Info1(0, 0);
        }
        Info1 leftInfo = process1(head.left);
        Info1 rightInfo = process1(head.right);
        int height = Math.max(leftInfo.height, rightInfo.height) + 1;
        int nodes = leftInfo.nodes + rightInfo.nodes + 1;
        return new Info1(height, nodes);
    }

    // 第二種方法
    // 收集子樹是否是滿二叉樹
    // 收集子樹的高度
    // 左樹滿 && 右樹滿 && 左右樹高度一樣 ->整棵樹是滿的
    public static boolean isFull2(Node head) {if (head == null) {return true;
        }
        return process2(head).isFull;
    }

    public static class Info2 {public boolean isFull;
        public int height;

        public Info2(boolean f, int h) {isFull = f;
            height = h;
        }
    }

    public static Info2 process2(Node h) {if (h == null) {return new Info2(true, 0);
        }
        Info2 leftInfo = process2(h.left);
        Info2 rightInfo = process2(h.right);
        boolean isFull = leftInfo.isFull && rightInfo.isFull && leftInfo.height == rightInfo.height;
        int height = Math.max(leftInfo.height, rightInfo.height) + 1;
        return new Info2(isFull, height);
    }

    // for test
    public static Node generateRandomBST(int maxLevel, int maxValue) {return generate(1, maxLevel, maxValue);
    }

    // for test
    public static Node generate(int level, int maxLevel, int maxValue) {if (level >maxLevel || Math.random()< 0.5) {return null;
        }
        Node head = new Node((int) (Math.random() * maxValue));
        head.left = generate(level + 1, maxLevel, maxValue);
        head.right = generate(level + 1, maxLevel, maxValue);
        return head;
    }

    public static void main(String[] args) {int maxLevel = 5;
        int maxValue = 100;
        int testTimes = 1000000;
        System.out.println("測試開始");
        for (int i = 0; i< testTimes; i++) {Node head = generateRandomBST(maxLevel, maxValue);
            if (isFull1(head) != isFull2(head)) {System.out.println("出錯了!");
            }
        }
        System.out.println("測試結束");
    }
}
更多

算法和數據結構筆記

你是否還在尋找穩定的海外服務器提供商?創新互聯www.cdcxhl.cn海外機房具備T級流量清洗系統配攻擊溯源,準確流量調度確保服務器高可用性,企業級服務器適合批量采購,新人活動首月15元起,快前往官網查看詳情吧


本文題目:判斷二叉樹是否為滿二叉樹-創新互聯
URL分享:http://m.jcarcd.cn/article/cssjos.html
主站蜘蛛池模板: 九九热思思精品视频 | 91社影院在线观看 | 国产在线高 | 日韩国产欧美 | 午夜视频一区二区 | 日本成本人片免费 | 韩国三级一区 | 国子监来了个女弟子 | 玖玖爱这里只有精品 | 日韩欧美在线视频 | 福利影院在线观看 | 成人午夜网站 | 日本一区二区 | 欧美中文高清日韩 | 国产精品精品国 | 91极品蜜桃臀 | 午夜偷拍精品福利 | 日韩在线精品一区 | 日本高清视频网址 | 国产性生大 | 尤物国产在线 | 人在线播放乱妇# | 日韩夜片 | 欧美亚洲性爱在线看 | 午夜国产福利在线 | 欧美日韩精品二区 | 国产在线观看视频 | 精品国产自产在线 | 欧美日韩综合在线 | 欧美亚洲综合视频 | 日本在线免费一区 | 国产性夜夜春夜夜爽 | 国产激情影视在线 | 日产国产欧洲系列 | 日本一区不| 国产精品日产三 | 欧美午夜电影福利 | 日本欧美 | 最新国产精品剧情在线ss | 精品国精品国产 | 岛国一区在线观看 |