国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js 中二叉樹的深度遍歷與廣度遍歷(遞歸實(shí)現(xiàn)與非遞歸實(shí)現(xiàn))

Yuanf / 1361人閱讀

摘要:樹中結(jié)點(diǎn)的最大層次稱為樹的深度或高度。二叉樹有深度遍歷和廣度遍歷,深度遍歷有前序中序和后序三種遍歷方法。二叉樹的前序遍歷可以用來顯示目錄結(jié)構(gòu)等中序遍歷可以實(shí)現(xiàn)表達(dá)式樹,在編譯器底層很有用后序遍歷可以用來實(shí)現(xiàn)計(jì)算目錄內(nèi)的文件及其信息等。

樹的簡介

棧、隊(duì)列、鏈表等數(shù)據(jù)結(jié)構(gòu),都是順序數(shù)據(jù)結(jié)構(gòu)。而樹是非順序數(shù)據(jù)結(jié)構(gòu)。樹型結(jié)構(gòu)是一類非常重要的非線性結(jié)構(gòu)。直觀地,樹型結(jié)構(gòu)是以分支關(guān)系定義的層次結(jié)構(gòu)。

樹在計(jì)算機(jī)領(lǐng)域中也有著廣泛的應(yīng)用,例如在編譯程序中,用樹來表示源程序的語法結(jié)構(gòu);在數(shù)據(jù)庫系統(tǒng)中,可用樹來組織信息;在分析算法的行為時(shí),可用樹來描述其執(zhí)行過程等等。

樹(Tree)是n(n>=0)個(gè)結(jié)點(diǎn)的有限集。在任意一棵非空樹中:

有且僅有一個(gè)特定的稱為根(Root)的結(jié)點(diǎn)

當(dāng)n>1時(shí),其余結(jié)點(diǎn)可分為m(m>0)個(gè)互不相交的有限集T1,T2,T3,...Tm,其中每一個(gè)集合本身又是一棵樹,并且稱為根的子樹(Subtree)

例如,(a)是只有一個(gè)根結(jié)點(diǎn)的樹;(b)是有13個(gè)結(jié)點(diǎn)的樹,其中A是根,其余結(jié)點(diǎn)分成3個(gè)互不相交的子集:T1={B,E,F,K,L},t2={D,H,I,J,M};T1,T2和T3都是根A的子樹,且本身也是一棵樹。

樹的結(jié)點(diǎn)包含一個(gè)數(shù)據(jù)元素及若干指向其子樹的分支。

結(jié)點(diǎn)擁有的子樹數(shù)稱為結(jié)點(diǎn)的度(Degree)。例如,(b)中A的度為3,C的度為1,F(xiàn)的度為0。度為0的結(jié)點(diǎn)稱為葉子(Leaf)或者終端結(jié)點(diǎn)。度不為0的結(jié)點(diǎn)稱為非終端結(jié)點(diǎn)或分支結(jié)點(diǎn)

樹的度是樹內(nèi)各結(jié)點(diǎn)的度的最大值。(b)的樹的度為3。結(jié)點(diǎn)的子樹的根稱為該結(jié)點(diǎn)的孩子(Child)。相應(yīng)的,該結(jié)點(diǎn)稱為孩子的雙親(Parent)。同一個(gè)雙親的孩子之間互稱兄弟(Sibling)。結(jié)點(diǎn)的祖先是從根到該結(jié)點(diǎn)所經(jīng)分支上的所有結(jié)點(diǎn)。反之,以某結(jié)點(diǎn)為根的子樹中的任一結(jié)點(diǎn)都稱為該結(jié)點(diǎn)的子孫。

結(jié)點(diǎn)的層次(Level)從根開始定義起,根為第一層,跟的孩子為第二層。若某結(jié)點(diǎn)在第層,則其子樹的根就在第l+1層。其雙親在同一層的結(jié)點(diǎn)互為堂兄弟。例如,結(jié)點(diǎn)G與E,F(xiàn),H,I,J互為堂兄弟。樹中結(jié)點(diǎn)的最大層次稱為樹的深度(Depth)或高度。(b)的樹的深度為4。

求樹的深度:看這篇:https://www.jianshu.com/p/9fc...

如果將樹中結(jié)點(diǎn)的各子樹看成從左至右是有次序的(即不能交換),則稱該樹為有序樹,否則稱為無序樹。在有序樹中最左邊的子樹的根稱為第一個(gè)孩子,最右邊的稱為最后一個(gè)孩子。

森林(Forest)是m(m>=0)棵互不相交的樹的集合。對(duì)樹中每個(gè)結(jié)點(diǎn)而言,其子樹的集合即為森林。

二叉樹

二叉樹(Binary Tree)是另一種樹型結(jié)構(gòu),它的特點(diǎn)是每個(gè)結(jié)點(diǎn)至多只有兩棵子樹(即二叉樹中不存在度大于2的結(jié)點(diǎn)),并且,二叉樹的子樹有左右之分(其次序不能任意顛倒。)

二叉樹的性質(zhì):

在二叉樹的第 i 層上至多有$2^{i-1}$個(gè)結(jié)點(diǎn)(i>=1)。

深度為k的二叉樹至多有$2^k - 1$個(gè)結(jié)點(diǎn),(k>=1)。

對(duì)任何一棵二叉樹T,如果其終端結(jié)點(diǎn)數(shù)為n0,度為2的結(jié)點(diǎn)數(shù)為n2,則n0 = n2 + 1;

一棵深度為k且有$2^k$ - 1個(gè)結(jié)點(diǎn)的二叉樹稱為滿二叉樹

深度為k的,有n個(gè)結(jié)點(diǎn)的二叉樹,當(dāng)且僅當(dāng)其每一個(gè)結(jié)點(diǎn)都與深度為k的滿二叉樹中編號(hào)從1至n的結(jié)點(diǎn)一一對(duì)應(yīng)時(shí),稱之為完全二叉樹

完全二叉樹的兩個(gè)特性:

具有n個(gè)結(jié)點(diǎn)的完全二叉樹的深度為$Math.floor(log_2 n) + 1$;

如果對(duì)一棵有n個(gè)結(jié)點(diǎn)的完全二叉樹(其深度為$Math.floor(log_2 n) + 1$)的結(jié)點(diǎn)按層序編號(hào)(從第1層到第$Math.floor(log_2 n) + 1$,每層從左到右),則對(duì)任一結(jié)點(diǎn)(1<=i<=n)有:

如果i=1,則結(jié)點(diǎn)i是二叉樹的根,無雙親;如果i>1,則其雙親parent(i)是結(jié)點(diǎn)Math.floor(i/2)。
如果2i > n,則結(jié)點(diǎn)i無左孩子(結(jié)點(diǎn)i為葉子結(jié)點(diǎn));否則其左孩子LChild(i)是結(jié)點(diǎn)2i.
如果2i + 1 > n,則結(jié)點(diǎn)i無右孩子;否則其右孩子RChild(i)是結(jié)點(diǎn)2i + 1;


二叉樹的存儲(chǔ)結(jié)構(gòu)

順序存儲(chǔ)結(jié)構(gòu)

用一組連續(xù)的存儲(chǔ)單元依次自上而下,自左至右存儲(chǔ)完全二叉樹上的結(jié)點(diǎn)元素,即將二叉樹上編號(hào)為i的結(jié)點(diǎn)元素存儲(chǔ)在加上定義的一維數(shù)組中下標(biāo)為i-1的分量中。“0”表示不存在此結(jié)點(diǎn)。這種順序存儲(chǔ)結(jié)構(gòu)僅適用于完全二叉樹。因?yàn)椋谧顗那闆r下,一個(gè)深度為k且只有k個(gè)結(jié)點(diǎn)的單支樹(樹中不存在度為2的結(jié)點(diǎn))卻需要長度為2的n次方-1的一維數(shù)組。

順序:[1, 2, 3, 4, 5, , 6, , , 7]

鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)

二叉樹的結(jié)點(diǎn)由一個(gè)數(shù)據(jù)元素和分別指向其左右子樹的兩個(gè)分支構(gòu)成,則表示二叉樹的鏈表中的結(jié)點(diǎn)至少包含三個(gè)域:數(shù)據(jù)域和左右指針域。有時(shí),為了便于找到結(jié)點(diǎn)的雙親,還可在結(jié)點(diǎn)結(jié)構(gòu)中增加一個(gè)指向其雙親結(jié)點(diǎn)的指針域。利用這兩種結(jié)構(gòu)所得的二叉樹的存儲(chǔ)結(jié)構(gòu)分別稱之為二叉鏈表和三叉鏈表。 在含有n個(gè)結(jié)點(diǎn)的二叉鏈表中有n+1個(gè)空鏈域,我們可以利用這些空鏈域存儲(chǔ)其他有用信息,從而得到另一種鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)---線索鏈表。

鏈?zhǔn)剑簕 data, left, right}

二叉樹的遍歷

遍歷二叉樹(Traversing Binary Tree):是指按指定的規(guī)律對(duì)二叉樹中的每個(gè)結(jié)點(diǎn)訪問一次且僅訪問一次。

二叉樹有深度遍歷和廣度遍歷, 深度遍歷有前序、 中序和后序三種遍歷方法。二叉樹的前序遍歷可以用來顯示目錄結(jié)構(gòu)等;中序遍歷可以實(shí)現(xiàn)表達(dá)式樹,在編譯器底層很有用;后序遍歷可以用來實(shí)現(xiàn)計(jì)算目錄內(nèi)的文件及其信息等。

二叉樹是非常重要的數(shù)據(jù)結(jié)構(gòu), 其中二叉樹的遍歷要使用到棧和隊(duì)列還有遞歸等,很多其它數(shù)據(jù)結(jié)構(gòu)也都是基于二叉樹的基礎(chǔ)演變而來的。熟練使用二叉樹在很多時(shí)候可以提升程序的運(yùn)行效率,減少代碼量,使程序更易讀

二叉樹不僅是一種數(shù)據(jù)結(jié)構(gòu),也是一種編程思想。學(xué)好二叉樹是程序員進(jìn)階的一個(gè)必然進(jìn)程。

前序遍歷:訪問根–>遍歷左子樹–>遍歷右子樹;
中序遍歷:遍歷左子樹–>訪問根–>遍歷右子樹;
后序遍歷:遍歷左子樹–>遍歷右子樹–>訪問根;
廣度遍歷:按照層次一層層遍歷;

例如(a+b*c)-d/e,該表達(dá)式用二叉樹表示如圖:

對(duì)該二叉樹進(jìn)行深度和廣度遍歷為:

前序遍歷:- + a b c / d e
中序遍歷:a + b * c - d / e
后序遍歷:a b c + d e / -
廣度遍歷:- + / a * d e b c

1. js中的二叉樹

上述二叉樹(a+b*c)-d/e在js中可以用對(duì)象的形式表示出來:

var tree = {
    value: "-",
    left: {
        value: "+",
        left: {
            value: "a",
        },
        right: {
            value: "*",
            left: {
                value: "b",
            },
            right: {
                value: "c",
            }
        }
    },
    right: {
        value: "/",
        left: {
            value: "d",
        },
        right: {
            value: "e",
        }
    }
}
2. js中二叉樹的深度遍歷

深度遍歷也可稱為深度優(yōu)先遍歷(Depth-First Search,DFS),因?yàn)樗偸莾?yōu)先往深處訪問。

先序遍歷

遞歸遍歷

let result = [];
let dfs = function (node) {
    if(node) {
        result.push(node.value);
        dfs(node.left);
        dfs(node.right);
    }
}

dfs(tree);
console.log(result); 
// ["-", "+", "a", "*", "b", "c", "/", "d", "e"]

先序遞歸遍歷思路:

先遍歷根結(jié)點(diǎn),將值存入數(shù)組,然后遞歸遍歷:先左結(jié)點(diǎn),將值存入數(shù)組,繼續(xù)向下遍歷;直到(二叉樹為空)子樹為空,則遍歷結(jié)束;
然后再回溯遍歷右結(jié)點(diǎn),將值存入數(shù)組,這樣遞歸循環(huán),直到(二叉樹為空)子樹為空,則遍歷結(jié)束。

非遞歸遍歷(利用棧:將遍歷到的結(jié)點(diǎn)都依次存入棧中,拿結(jié)果時(shí)從棧中訪問

let dfs = function (nodes) {
    let result = [];
    let stack = [];
    stack.push(nodes);
    while(stack.length) { // 等同于 while(stack.length !== 0) 直到棧中的數(shù)據(jù)為空
        let node = stack.pop(); // 取的是棧中最后一個(gè)j
        result.push(node.value);
        if(node.right) stack.push(node.right); // 先壓入右子樹
        if(node.left) stack.push(node.left); // 后壓入左子樹
    }
    return result;
}
dfs(tree);

先序非遞歸遍歷思路:

初始化一個(gè)棧,將根節(jié)點(diǎn)壓入棧中;

當(dāng)棧為非空時(shí),循環(huán)執(zhí)行步驟3到4,否則執(zhí)行結(jié)束;

從隊(duì)列取得一個(gè)結(jié)點(diǎn)(取的是棧中最后一個(gè)結(jié)點(diǎn)),將該值放入結(jié)果數(shù)組;

若該結(jié)點(diǎn)的右子樹為非空,則將該結(jié)點(diǎn)的右子樹入棧,若該結(jié)點(diǎn)的左子樹為非空,則將該結(jié)點(diǎn)的左子樹入棧;(注意:先將右結(jié)點(diǎn)壓入棧中,后壓入左結(jié)點(diǎn),從棧中取得時(shí)候是取最后一個(gè)入棧的結(jié)點(diǎn),而先序遍歷要先遍歷左子樹,后遍歷右子樹)

中序遍歷

遞歸遍歷

let result = [];
let dfs = function (node) {
     if(node) {
        dfs(node.left);
        result.push(node.value); // 直到該結(jié)點(diǎn)無左子樹 將該結(jié)點(diǎn)存入結(jié)果數(shù)組 接下來并開始遍歷右子樹
        dfs(node.right);
    }
}

dfs(tree);
console.log(result);
// ?["a", "+", "b", "*", "c", "-", "d", "/", "e"]

中序遞歸遍歷的思路:

先遞歸遍歷左子樹,從最后一個(gè)左子樹開始存入數(shù)組,然后回溯遍歷雙親結(jié)點(diǎn),再是右子樹,這樣遞歸循環(huán)。

非遞歸遍歷

function dfs(node) {
    let result = [];
    let stack = [];
    while(stack.length || node) { // 是 || 不是 &&
        if(node) {
            stack.push(node);
            node = node.left;
        } else {
            node = stack.pop();
            result.push(node.value);
            //node.right && stack.push(node.right);
            node = node.right; // 如果沒有右子樹 會(huì)再次向棧中取一個(gè)結(jié)點(diǎn)即雙親結(jié)點(diǎn)
        }
    }
    return result;
}

dfs(tree);
// ["a", "+", "b", "*", "c", "-", "d", "/", "e"]

一種利用回溯法思想的代碼:
看這里:https://zhuanlan.zhihu.com/p/... 但是他的代碼有些問題。。。

非遞歸遍歷的思路:

將當(dāng)前結(jié)點(diǎn)壓入棧,然后將左子樹當(dāng)做當(dāng)前結(jié)點(diǎn),如果當(dāng)前結(jié)點(diǎn)為空,將雙親結(jié)點(diǎn)取出來,將值保存進(jìn)數(shù)組,然后將右子樹當(dāng)做當(dāng)前結(jié)點(diǎn),進(jìn)行循環(huán)。

后序遍歷

遞歸遍歷

result = [];
function dfs(node) {
    if(node) {
        dfs(node.left);
        dfs(node.right);
        result.push(node.value);
    }
}
dfs(tree);
console.log(result);
// ["a", "b", "c", "*", "+", "d", "e", "/", "-"]

寫到這,深深的被遞歸折服。。。。服

先走左子樹,當(dāng)左子樹沒有孩子結(jié)點(diǎn)時(shí),將此結(jié)點(diǎn)的值放入數(shù)組中,然后回溯遍歷雙親結(jié)點(diǎn)的右結(jié)點(diǎn),遞歸遍歷。

非遞歸遍歷

(含大量注釋代碼的)

function dfs(node) {
    let result = [];
    let stack = [];
    stack.push(node);
    while(stack.length) {
        // 不能用node.touched !== "left" 標(biāo)記‘left’做判斷,
        // 因?yàn)榛厮莸皆摻Y(jié)點(diǎn)時(shí),遍歷右子樹已經(jīng)完成,該結(jié)點(diǎn)標(biāo)記被更改為‘right’ 若用標(biāo)記‘left’判斷該if語句會(huì)一直生效導(dǎo)致死循環(huán)
        if(node.left && !node.touched) { // 不要寫成if(node.left && node.touched !== "left")
            // 遍歷結(jié)點(diǎn)左子樹時(shí),對(duì)該結(jié)點(diǎn)做 ‘left’標(biāo)記;為了子結(jié)點(diǎn)回溯到該(雙親)結(jié)點(diǎn)時(shí),便不再訪問左子樹
            node.touched = "left";
            node = node.left;
            stack.push(node);
            continue;
        }
        if(node.right && node.touched !== "right") { // 右子樹同上
            node.touched = "right";
            node = node.right;
            stack.push(node);
            continue;
        }
        node = stack.pop(); // 該結(jié)點(diǎn)無左右子樹時(shí),從棧中取出一個(gè)結(jié)點(diǎn),訪問(并清理標(biāo)記)
        node.touched && delete node.touched; // 可以不清理不影響結(jié)果 只是第二次對(duì)同一顆樹再執(zhí)行該后序遍歷方法時(shí),結(jié)果就會(huì)出錯(cuò)啦因?yàn)槟銓?duì)這棵樹做的標(biāo)記還留在這棵樹上
        result.push(node.value);
        node = stack.length ? stack[stack.length - 1] : null;
        //node = stack.pop(); 這時(shí)當(dāng)前結(jié)點(diǎn)不再從棧中取(彈出),而是不改變棧數(shù)據(jù)直接訪問棧中最后一個(gè)結(jié)點(diǎn)
        //如果這時(shí)當(dāng)前結(jié)點(diǎn)去棧中取(彈出)會(huì)導(dǎo)致回溯時(shí)當(dāng)該結(jié)點(diǎn)左右子樹都被標(biāo)記過時(shí) 當(dāng)前結(jié)點(diǎn)又變成從棧中取會(huì)漏掉對(duì)結(jié)點(diǎn)的訪問(存入結(jié)果數(shù)組中)
    }
    return result; // 返回值
}

dfs(tree);

后序遍歷非遞歸遍歷思路:先把根結(jié)點(diǎn)和左樹推入棧,然后取出左樹,再推入右樹,取出,最后取根結(jié)點(diǎn)。

步驟:

初始化一個(gè)棧,將根節(jié)點(diǎn)壓入棧中,并標(biāo)記為當(dāng)前節(jié)點(diǎn)(node);

當(dāng)棧為非空時(shí),執(zhí)行步驟3,否則執(zhí)行結(jié)束;

如果當(dāng)前節(jié)點(diǎn)(node)有左子樹且沒有被 touched,則執(zhí)行4;如果當(dāng)前結(jié)點(diǎn)有右子樹,被 touched left 但沒有被 touched right 則執(zhí)行5 否則執(zhí)行6;

對(duì)當(dāng)前節(jié)點(diǎn)(node)標(biāo)記 touched left,將當(dāng)前節(jié)點(diǎn)的左子樹賦值給當(dāng)前節(jié)點(diǎn)(node=node.left) 并將當(dāng)前節(jié)點(diǎn)(node)壓入棧中,回到3;

對(duì)當(dāng)前節(jié)點(diǎn)(node)標(biāo)記 touched right,將當(dāng)前節(jié)點(diǎn)的右子樹賦值給當(dāng)前節(jié)點(diǎn)(node=node.right) 并將當(dāng)前節(jié)點(diǎn)(node)壓入棧中,回到3;

清理當(dāng)前節(jié)點(diǎn)(node)的 touched 標(biāo)記,彈出棧中的一個(gè)節(jié)點(diǎn)并訪問,然后再將棧頂節(jié)點(diǎn)標(biāo)記為當(dāng)前節(jié)點(diǎn)(item),回到3;

3. js中二叉樹的廣度遍歷

廣度優(yōu)先遍歷二叉樹(層序遍歷)是用隊(duì)列來實(shí)現(xiàn)的,廣度遍歷是從二叉樹的根結(jié)點(diǎn)開始,自上而下逐層遍歷;在同一層中,按照從左到右的順序?qū)Y(jié)點(diǎn)逐一訪問。

遞歸遍歷

let result = [];
let stack = [tree]; // 先將要遍歷的樹壓入棧
let count = 0; // 用來記錄執(zhí)行到第一層
let bfs = function () {
    let node = stack[count];
    if(node) {
        result.push(node.value);
        if(node.left) stack.push(node.left);
        if(node.right) stack.push(node.right);
        count++;
        bfs();
    }
}
dfc();
console.log(result);
// ?["-", "+", "/", "a", "*", "d", "e", "b", "c"]

非遞歸算法

function bfs(node) {
    let result = [];
    let queue = [];
    queue.push(node);
    let pointer = 0;
    while(pointer < queue.length) {
        let node = queue[pointer++]; // // 這里不使用 shift 方法(復(fù)雜度高),用一個(gè)指針代替
        result.push(node.value);
        node.left && queue.push(node.left);
        node.right && queue.push(node.right);
    }
    return result;
}

bfs(tree);
// ["-", "+", "/", "a", "*", "d", "e", "b", "c"]

另外一種比較消耗性能的方法:不額外定義一個(gè)指針變量 pointer,使用數(shù)組的shift()方法,每次改變 queue 的數(shù)據(jù)(入棧、出棧),來讀取數(shù)據(jù),直到棧 queue 中數(shù)據(jù)為空,執(zhí)行結(jié)束。(頻繁的改變數(shù)組,因?yàn)閿?shù)組是引用類型,要改變它,要新開辟一個(gè)地址,所以比較消耗空間)

function bfs (node) {
    let result = [];
    let queue = [];
    queue.push(node);
    while(queue.length) {
        node = queue.shift();
        result.push(node.value); // 不要忘記訪問
        // console.log(node.value);
        node.left && queue.push(node.left);
        node.right && queue.push(node.right);
    }
    return result;
}
bfs(tree);
//? ["-", "+", "/", "a", "*", "d", "e", "b", "c"]
References

二叉樹與JavaScript
JavaScript與簡單算法
javascript實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu): 樹和二叉樹,二叉樹的遍歷和基本操作
圖的基本算法(BFS和DFS)
搜索思想——DFS & BFS(基礎(chǔ)基礎(chǔ)篇)

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/97238.html

相關(guān)文章

  • 叉樹遍歷

    摘要:前言本篇文章是在二叉排序樹的基礎(chǔ)上進(jìn)行遍歷查找與刪除結(jié)點(diǎn)。接下來我們根據(jù)構(gòu)造的這顆二叉樹進(jìn)行相應(yīng)遍歷查找與刪除操作。遍歷二叉樹二叉樹的遍歷分為深度優(yōu)先遍歷和廣度優(yōu)先遍歷。中序遍歷二叉排序樹,得到的數(shù)組是有序的且是升序的。 前言 本篇文章是在二叉排序樹的基礎(chǔ)上進(jìn)行遍歷、查找、與刪除結(jié)點(diǎn)。 那么首先來看一下什么是二叉排序樹? 二叉排序樹 定義 二叉排序樹,又稱二叉查找樹、二叉搜索樹。 若...

    aboutU 評(píng)論0 收藏0
  • JS中的二叉樹遍歷

    摘要:一個(gè)二叉樹的例子廣度優(yōu)先遍歷廣度優(yōu)先遍歷是從二叉樹的第一層根結(jié)點(diǎn)開始,自上至下逐層遍歷在同一層中,按照從左到右的順序?qū)Y(jié)點(diǎn)逐一訪問。有的書里將二叉樹的遍歷只講了上面三種遞歸遍歷。 二叉樹是由根節(jié)點(diǎn),左子樹,右子樹組成,左子樹和友子樹分別是一個(gè)二叉樹。這篇文章主要在JS中實(shí)現(xiàn)二叉樹的遍歷。 一個(gè)二叉樹的例子 var tree = { value: 1, left: { ...

    ghnor 評(píng)論0 收藏0
  • 樹和樹的算法

    摘要:樹和樹的算法一樹樹的概念樹英語是一種抽象數(shù)據(jù)類型或是實(shí)作這種抽象數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu),用來模擬具有樹狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。一種時(shí)間復(fù)雜度額外空間復(fù)雜度的二叉樹的遍歷方式,為二叉樹的節(jié)點(diǎn)個(gè)數(shù)。 樹和樹的算法 一、樹 1.1 樹的概念 樹(英語:tree)是一種抽象數(shù)據(jù)類型(ADT)或是實(shí)作這種抽象數(shù)據(jù)類型的數(shù)據(jù)結(jié)構(gòu),用來模擬具有樹狀結(jié)構(gòu)性質(zhì)的數(shù)據(jù)集合。它是由n(n>=1)個(gè)有限節(jié)點(diǎn)組成一個(gè)...

    RaoMeng 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<