0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
电子发烧友
开通电子发烧友VIP会员 尊享10大特权
海量资料免费下载
精品直播免费看
优质内容免费畅学
课程9折专享价
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

AVL 樹(shù)和普通的二叉查找樹(shù)的詳細(xì)區(qū)別分析

算法與數(shù)據(jù)結(jié)構(gòu) ? 2018-01-15 14:36 ? 次閱讀

背景

AVL 樹(shù)是一棵平衡的二叉查找樹(shù),于 1962 年,G. M. Adelson-Velsky 和 E. M. Landis 在他們的論文《An algorithm for the organization of information》中發(fā)表。

所謂的平衡之意,就是樹(shù)中任意一個(gè)結(jié)點(diǎn)下左右兩個(gè)子樹(shù)的高度差不超過(guò) 1。(本文對(duì)于樹(shù)的高度約定為:空結(jié)點(diǎn)高度是 0,葉子結(jié)點(diǎn)高度是 1。)

那 AVL 樹(shù)和普通的二叉查找樹(shù)有何區(qū)別呢?如圖,如果我們插入的是一組有序上升或下降的數(shù)據(jù),則一棵普通的二叉查找樹(shù)必然會(huì)退化成一個(gè)單鏈表,其查找效率就降為 O(n)。而 AVL 樹(shù)因其平衡的限制,可以始終保持 O(logn) 的時(shí)間復(fù)雜度。

具體實(shí)現(xiàn)與代碼分析

在我們進(jìn)行完插入或刪除操作后,很可能會(huì)導(dǎo)致某個(gè)結(jié)點(diǎn)失去平衡,那么我們就需要把失衡結(jié)點(diǎn)旋轉(zhuǎn)一下,使其重新恢復(fù)平衡。

經(jīng)過(guò)分析,不管是插入還是刪除,它們都會(huì)有四種失衡的情況:左左失衡,右右失衡,左右失衡,右左失衡。因此每次遇到失衡時(shí),我們只需判斷一下是哪個(gè)失衡,再對(duì)其進(jìn)行相對(duì)應(yīng)的恢復(fù)平衡操作即可。

好,下面以插入操作為例,來(lái)看下這四種失衡的廬山真面目。(以下統(tǒng)一約定:紅色結(jié)點(diǎn)為新插入結(jié)點(diǎn),y 結(jié)點(diǎn)為失衡結(jié)點(diǎn))

(1)左左失衡

 AVL 樹(shù)和普通的二叉查找樹(shù)的詳細(xì)區(qū)別分析

所謂的左左,即 "失衡結(jié)點(diǎn)" 的左子樹(shù)比右子樹(shù)高 2,左孩子下的左子樹(shù)比右子樹(shù)高 1。

我們只需對(duì) "以 y 為根的子樹(shù)" 進(jìn)行 "左左旋轉(zhuǎn) (ll_rotate)" 即可。一次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::ll_rotate(Node * y)

{

Node * x = y->left;

y->left = x->right;

x->right = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

(2)右右失衡

所謂的右右,即 "失衡結(jié)點(diǎn)" 的右子樹(shù)比左子樹(shù)高 2,右孩子下的右子樹(shù)比左子樹(shù)高 1。

我們只需對(duì) "以 y 為根的子樹(shù)" 進(jìn)行 "右右旋轉(zhuǎn) (rr_rotate)" 即可。一次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::rr_rotate(Node * y)

{

Node * x = y->right;

y->right = x->left;

x->left = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

(3)左右失衡

 AVL 樹(shù)和普通的二叉查找樹(shù)的詳細(xì)區(qū)別分析

所謂的左右,即 "失衡結(jié)點(diǎn)" 的左子樹(shù)比右子樹(shù)高 2,左孩子下的右子樹(shù)比左子樹(shù)高 1。

觀察發(fā)現(xiàn),若先對(duì) "以 x 為根的子樹(shù)" 進(jìn)行 "右右旋轉(zhuǎn) (rr_rotate)",此時(shí) "以 y 為根的子樹(shù)" 恰好符合 "左左失衡",所以再進(jìn)行一次 "左左旋轉(zhuǎn) (ll_rotate)"。兩次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::lr_rotate(Node * y)

{

Node * x = y->left;

y->left = rr_rotate(x);

return ll_rotate(y);

}

(4)右左失衡

 AVL 樹(shù)和普通的二叉查找樹(shù)的詳細(xì)區(qū)別分析

所謂的右左,即 "失衡結(jié)點(diǎn)" 的右子樹(shù)比左子樹(shù)高 2,右孩子下的左子樹(shù)比右子樹(shù)高 1。

觀察發(fā)現(xiàn),若先對(duì) "以 x 為根的子樹(shù)" 進(jìn)行 "左左旋轉(zhuǎn) (ll_rotate)",此時(shí) "以 y 為根的子樹(shù)" 恰好符合 "右右失衡",所以再進(jìn)行一次 "右右旋轉(zhuǎn) (rr_rotate)"。兩次旋轉(zhuǎn)后,恢復(fù)平衡。

Node * AVL::rl_rotate(Node * y)

{

Node * x = y->right;

y->right = ll_rotate(x);

return rr_rotate(y);

}

插入操作

插入成功后,在遞歸回溯時(shí)依次對(duì)經(jīng)過(guò)的結(jié)點(diǎn)判斷是否失衡,若失衡就需要對(duì)其進(jìn)行對(duì)應(yīng)的旋轉(zhuǎn)操作使其恢復(fù)平衡,在這期間,原先作為一棵子樹(shù)的根結(jié)點(diǎn)就會(huì)因?yàn)樾D(zhuǎn)被替換,因此設(shè)置insert_real( )返回的是新根結(jié)點(diǎn),這樣就可以實(shí)時(shí)更新根結(jié)點(diǎn)。

插入操作實(shí)現(xiàn)代碼如下:

int AVL::get_height(Node * node)

{

if (node == nullptr)

return 0;

return node->height;

}

int AVL::get_balance(Node * node)

{

if (node == nullptr)

return 0;

return get_height(node->left) - get_height(node->right);

}

Node * AVL::insert_real(int key, Node * node)

{

if (node == nullptr)

return new Node(key);

if (key < node->key)

node->left = insert_real(key, node->left);

else if (key > node->key)

node->right = insert_real(key, node->right);

else

return node;

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) > 0)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) < 0)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

void AVL::insert(int key)

{

header->left = insert_real(key, header->left);

}

查找操作

Node * AVL::find_real(int key, Node * node)

{

if (node == nullptr)

return nullptr;

if (key < node->key)

return find_real(key, node->left);

else if (key > node->key)

return find_real(key, node->right);

else

return node;

}

Node * AVL::find(int key)

{

return find_real(key, header->left);

}

刪除操作

刪除操作的四種失衡情況和插入操作一樣,讀者可以參考前文。下面是刪除操作的實(shí)現(xiàn)代碼:

Node * AVL::erase_real(int key, Node * node)

{

if (node == nullptr)

return node;

if (key < node->key)

node->left = erase_real(key, node->left);

else if (key > node->key)

node->right = erase_real(key, node->right);

else

{

if (node->left && node->right)

{

// 找到后繼結(jié)點(diǎn)

Node * x = node->right;

while (x->left)

x = x->left;

// 后繼直接復(fù)制

node->key = x->key;

// 轉(zhuǎn)化為刪除后繼

node->right = erase_real(x->key, node->right);

}

else

{

Node * t = node;

node = node->left ? node->left : node->right;

delete t;

if (node == nullptr)

return nullptr;

}

}

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) >= 0) // 需要加等號(hào)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) <= 0) // 需要加等號(hào)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

void AVL::erase(int key)

{

header->left = erase_real(key, header->left);

}

完整代碼

/**

*

* author : 劉毅(Limer)

* date : 2017-08-17

* mode : C++

*/

#include

#include

using namespace std;

struct Node

{

int key;

int height;

Node * left;

Node * right;

Node(int key = 0)

{

this->key = key;

this->height = 1;

this->left = this->right = nullptr;

}

};

class AVL

{

private:

Node * header;

private:

Node * ll_rotate(Node * y);

Node * rr_rotate(Node * y);

Node * lr_rotate(Node * y);

Node * rl_rotate(Node * y);

void destroy(Node * node);

int get_height(Node * node);

int get_balance(Node * node);

Node * insert_real(int key, Node * node);

Node * find_real(int key, Node * node);

Node * erase_real(int key, Node * node);

void in_order(Node * node);

public:

AVL();

~AVL();

void insert(int key);

Node * find(int key);

void erase(int key);

void print();

};

Node * AVL::ll_rotate(Node * y)

{

Node * x = y->left;

y->left = x->right;

x->right = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

Node * AVL::rr_rotate(Node * y)

{

Node * x = y->right;

y->right = x->left;

x->left = y;

y->height = max(get_height(y->left), get_height(y->right)) + 1;

x->height = max(get_height(x->left), get_height(x->right)) + 1;

return x;

}

Node * AVL::lr_rotate(Node * y)

{

Node * x = y->left;

y->left = rr_rotate(x);

return ll_rotate(y);

}

Node * AVL::rl_rotate(Node * y)

{

Node * x = y->right;

y->right = ll_rotate(x);

return rr_rotate(y);

}

void AVL::destroy(Node * node)

{

if (node == nullptr)

return;

destroy(node->left);

destroy(node->right);

delete node;

}

int AVL::get_height(Node * node)

{

if (node == nullptr)

return 0;

return node->height;

}

int AVL::get_balance(Node * node)

{

if (node == nullptr)

return 0;

return get_height(node->left) - get_height(node->right);

}

Node * AVL::insert_real(int key, Node * node)

{

if (node == nullptr)

return new Node(key);

if (key < node->key)

node->left = insert_real(key, node->left);

else if (key > node->key)

node->right = insert_real(key, node->right);

else

return node;

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) > 0)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) < 0)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

Node * AVL::find_real(int key, Node * node)

{

if (node == nullptr)

return nullptr;

if (key < node->key)

return find_real(key, node->left);

else if (key > node->key)

return find_real(key, node->right);

else

return node;

}

Node * AVL::erase_real(int key, Node * node)

{

if (node == nullptr)

return node;

if (key < node->key)

node->left = erase_real(key, node->left);

else if (key > node->key)

node->right = erase_real(key, node->right);

else

{

if (node->left && node->right)

{

// 找到后繼結(jié)點(diǎn)

Node * x = node->right;

while (x->left)

x = x->left;

// 后繼直接復(fù)制

node->key = x->key;

// 轉(zhuǎn)化為刪除后繼

node->right = erase_real(x->key, node->right);

}

else

{

Node * t = node;

node = node->left ? node->left : node->right;

delete t;

if (node == nullptr)

return nullptr;

}

}

node->height = max(get_height(node->left), get_height(node->right)) + 1;

int balance = get_balance(node);

// 左左失衡

if (balance > 1 && get_balance(node->left) >= 0) // 需要加等號(hào)

return ll_rotate(node);

// 右右失衡

if (balance < -1 && get_balance(node->right) <= 0) // 需要加等號(hào)

return rr_rotate(node);

// 左右失衡

if (balance > 1 && get_balance(node->left) < 0)

return lr_rotate(node);

// 右左失衡

if (balance < -1 && get_balance(node->right) > 0)

return rl_rotate(node);

return node;

}

void AVL::in_order(Node * node)

{

if (node == nullptr)

return;

in_order(node->left);

cout << node->key << " ";

in_order(node->right);

}

AVL::AVL()

{

header = new Node(0);

}

AVL::~AVL()

{

destroy(header->left);

delete header;

header = nullptr;

}

void AVL::insert(int key)

{

header->left = insert_real(key, header->left);

}

Node * AVL::find(int key)

{

return find_real(key, header->left);

}

void AVL::erase(int key)

{

header->left = erase_real(key, header->left);

}

void AVL::print()

{

in_order(header->left);

cout << endl;

}

int main()

{

AVL avl;

// test "insert"

avl.insert(7);

avl.insert(2);

avl.insert(1); avl.insert(1);

avl.insert(5);

avl.insert(3);

avl.insert(6);

avl.insert(4);

avl.insert(9);

avl.insert(8);

avl.insert(11); avl.insert(11);

avl.insert(10);

avl.insert(12);

avl.print(); // 1 2 3 4 5 6 7 8 9 10 11 12

// test "find"

Node * p = nullptr;

cout << ((p = avl.find(2)) ? p->key : -1) << endl;? ?//? 2

cout << ((p = avl.find(100)) ? p->key : -1) << endl; // -1

// test "erase"

avl.erase(1);

avl.print(); // 2 3 4 5 6 7 8 9 10 11 12

avl.erase(9);

avl.print(); // 2 3 4 5 6 7 8 10 11 12

avl.erase(11);

avl.print(); // 2 3 4 5 6 7 8 10 12

return 0;

}

起初構(gòu)造的 AVL 樹(shù)為下圖:

總結(jié)

和二叉查找樹(shù)相比,AVL 樹(shù)的特點(diǎn)是時(shí)間復(fù)雜度更穩(wěn)定,但缺點(diǎn)也是很明顯的。

插入操作中,至多需要一次恢復(fù)平衡操作,遞歸回溯的量級(jí)為 O(logn)。有一點(diǎn)需要我們注意,在對(duì)第一個(gè)失衡結(jié)點(diǎn)進(jìn)行恢復(fù)平衡后,遞歸回溯就應(yīng)該立即停止(因?yàn)槭Ш饨Y(jié)點(diǎn)的父親及其祖先們肯定都是處于平衡狀態(tài)的)。

但讓 "遞歸的回溯" 中途停止,不好實(shí)現(xiàn),所以我上面的編碼程序都不可避免的會(huì)繼續(xù)回溯,直到整棵樹(shù)的根結(jié)點(diǎn),而這些回溯都是沒(méi)有必要的。(謝謝 LLL 的提醒,若在結(jié)點(diǎn)中增設(shè)父親結(jié)點(diǎn),就可以解決遞歸回溯的問(wèn)題)

刪除操作中,若存在失衡,則至少需要一次恢復(fù)平衡操作,遞歸回溯的量級(jí)亦為 O(logn)。與插入操作不同,當(dāng)對(duì)第一個(gè)失衡結(jié)點(diǎn)恢復(fù)平衡后,它的父親或者是它的祖先們也可能是非平衡的(見(jiàn)下圖,刪除 1),所以刪除操作的回溯很有必要。

沒(méi)有參照物對(duì)比的探討是沒(méi)有意義的,所以此文就止于此吧,有興趣的朋友可以看下我后面《紅黑樹(shù)》及《AVL 樹(shù)與紅黑樹(shù)的對(duì)比》的文章。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • AVL
    AVL
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    10116
  • 二叉樹(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12507

原文標(biāo)題:一文讀懂 AVL 樹(shù)

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 0人收藏

    評(píng)論

    相關(guān)推薦

    二叉查找樹(shù)(GIF動(dòng)圖講解)

    二叉查找樹(shù)(Binary Search Tree),也稱二叉搜索樹(shù),是指一棵空樹(shù)或者具有下列性質(zhì)
    發(fā)表于 07-29 15:24

    二叉樹(shù)層次遍歷算法的驗(yàn)證

    實(shí)現(xiàn)二叉樹(shù)的層次遍歷算法,并對(duì)用”A(B(D,E(H(J,K(L,M(,N))))),C(F,G(,I)))”創(chuàng)建的二叉樹(shù)進(jìn)行測(cè)試。
    發(fā)表于 11-28 01:05 ?2174次閱讀
    <b class='flag-5'>二叉樹(shù)</b>層次遍歷算法的驗(yàn)證

    詳解電源二叉樹(shù)到底是什么

    作為數(shù)據(jù)結(jié)構(gòu)的基礎(chǔ),樹(shù)分很多種,像 AVL 樹(shù)、紅黑樹(shù)、二叉搜索樹(shù)....今天我想分享的是關(guān)于
    的頭像 發(fā)表于 06-06 15:05 ?1w次閱讀
    詳解電源<b class='flag-5'>二叉樹(shù)</b>到底是什么

    PCB板設(shè)計(jì)的電源二叉樹(shù)分析詳細(xì)資料說(shuō)明

    本文檔的主要內(nèi)容詳細(xì)介紹的是PCB板設(shè)計(jì)的電源二叉樹(shù)分析詳細(xì)資料說(shuō)明。
    發(fā)表于 07-29 08:00 ?0次下載
    PCB板設(shè)計(jì)的電源<b class='flag-5'>二叉樹(shù)</b><b class='flag-5'>分析</b><b class='flag-5'>詳細(xì)</b>資料說(shuō)明

    C語(yǔ)言二叉樹(shù)代碼免費(fèi)下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是C語(yǔ)言二叉樹(shù)代碼免費(fèi)下載。
    發(fā)表于 08-27 08:00 ?1次下載

    紅黑樹(shù)(Red Black Tree)是一種自平衡的二叉搜索樹(shù)

    平衡(Balance):就是當(dāng)結(jié)點(diǎn)數(shù)量固定時(shí),左右子樹(shù)的高度越接近,這棵二叉樹(shù)越平衡(高度越低)。而最理想的平衡就是完全二叉樹(shù)/滿二叉樹(shù),高度最小的二叉樹(shù)。
    的頭像 發(fā)表于 07-01 15:05 ?5963次閱讀
    紅黑<b class='flag-5'>樹(shù)</b>(Red Black Tree)是一種自平衡的<b class='flag-5'>二叉</b>搜索<b class='flag-5'>樹(shù)</b>

    二叉樹(shù)操作的相關(guān)知識(shí)和代碼詳解

    樹(shù)是數(shù)據(jù)結(jié)構(gòu)中的重中之重,尤其以各類二叉樹(shù)為學(xué)習(xí)的難點(diǎn)。在面試環(huán)節(jié)中,二叉樹(shù)也是必考的模塊。本文主要講二叉樹(shù)操作的相關(guān)知識(shí),梳理面試??嫉膬?nèi)容。請(qǐng)大家跟隨小編一起來(lái)復(fù)習(xí)吧。 本篇針對(duì)面
    的頭像 發(fā)表于 12-12 11:04 ?2165次閱讀
    <b class='flag-5'>二叉樹(shù)</b>操作的相關(guān)知識(shí)和代碼詳解

    二叉樹(shù)的前序遍歷非遞歸實(shí)現(xiàn)

    我們之前說(shuō)了二叉樹(shù)基礎(chǔ)及二叉的幾種遍歷方式及練習(xí)題,今天我們來(lái)看一下二叉樹(shù)的前序遍歷非遞歸實(shí)現(xiàn)。 前序遍歷的順序是, 對(duì)于樹(shù)中的某節(jié)點(diǎn),先遍歷該節(jié)點(diǎn),然后再遍歷其左子樹(shù),最后遍歷其右子
    的頭像 發(fā)表于 05-28 13:59 ?2074次閱讀

    如何修剪二叉搜索樹(shù)

    ? 如果不對(duì)遞歸有深刻的理解,本題有點(diǎn)難。單純移除一個(gè)節(jié)點(diǎn)那還不夠,要修剪! 669. 修剪二叉搜索樹(shù) ? 給定一個(gè)二叉搜索樹(shù),同時(shí)給定最小邊界L 和最大邊界 R。通過(guò)修剪
    的頭像 發(fā)表于 10-11 14:16 ?1467次閱讀

    二叉排序樹(shù)AVL如何實(shí)現(xiàn)動(dòng)態(tài)平衡

    熟悉的二叉樹(shù)種類有二叉搜索(排序、查找)樹(shù)、二叉平衡樹(shù)、伸展
    的頭像 發(fā)表于 10-28 17:02 ?1981次閱讀
    <b class='flag-5'>二叉排序樹(shù)</b><b class='flag-5'>AVL</b>如何實(shí)現(xiàn)動(dòng)態(tài)平衡

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu):什么是二叉樹(shù)?

    完全二叉樹(shù):完全二叉樹(shù)是效率很高的數(shù)據(jù)結(jié)構(gòu)。對(duì)于深度為K,有n個(gè)節(jié)點(diǎn)的二叉樹(shù),當(dāng)且僅當(dāng)每一個(gè)節(jié)點(diǎn)都與深度為K的滿二叉樹(shù)中編號(hào)從1至n的節(jié)點(diǎn)一一對(duì)應(yīng)時(shí),稱為完全
    的頭像 發(fā)表于 04-21 16:20 ?3062次閱讀

    怎么就能構(gòu)造成二叉樹(shù)呢?

    一直跟著公眾號(hào)學(xué)算法的錄友 應(yīng)該知道,我在二叉樹(shù):構(gòu)造二叉樹(shù)登場(chǎng)!,已經(jīng)講過(guò),只有 中序與后序 和 中序和前序 可以確定一顆唯一的二叉樹(shù)。前序和后序是不能確定唯一的二叉樹(shù)的。
    的頭像 發(fā)表于 07-14 11:20 ?1740次閱讀

    使用C語(yǔ)言代碼實(shí)現(xiàn)平衡二叉樹(shù)

    這篇博客主要總結(jié)平衡二叉樹(shù),所以,二叉排序樹(shù)知識(shí)不會(huì)提及,但是會(huì)用到。
    的頭像 發(fā)表于 09-21 11:00 ?1245次閱讀

    二叉樹(shù)的代碼實(shí)現(xiàn)

    二叉樹(shù)的主要操作有遍歷,例如有先序遍歷、中序遍歷、后序遍歷。在遍歷之前,就是創(chuàng)建一棵二叉樹(shù),當(dāng)然,還需要有刪除二叉樹(shù)的算法。
    的頭像 發(fā)表于 01-18 10:41 ?1352次閱讀
    <b class='flag-5'>二叉樹(shù)</b>的代碼實(shí)現(xiàn)

    C++自定義二叉樹(shù)并輸出二叉樹(shù)圖形

    使用C++構(gòu)建一個(gè)二叉樹(shù)并輸出。
    的頭像 發(fā)表于 01-10 16:29 ?1925次閱讀
    C++自定義<b class='flag-5'>二叉樹(shù)</b>并輸出<b class='flag-5'>二叉樹(shù)</b>圖形

    電子發(fā)燒友

    中國(guó)電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品