資料結構練手04 二叉樹之鍊錶實現

2022-07-05 02:15:08 字數 4160 閱讀 1246

晚上和朋友出去小飲了幾杯,調侃了下blablabla。。。現在有點暈乎乎的,文章可能很凌亂,算是很抱歉。

下午實現了下鍊錶形式的二叉樹,頓時感覺資料結構的實現,理論和實際的差距還是很大的。要走的路還是很長遠的。總結下,就是遞迴很重要,這個是解決樹問題的核心鑰匙!

對於二叉樹,很多實現是基於排序二叉樹的線性表示,即可以根據父節點的索引直接定位到子節點的位置,即 parent*2 = leftchild, parent*2+1=rightchild等等,一切可以用公式表示。

本文,我們採用指標形式來實現。

每個資料結構的實現,首要是實現結點類的設計。根據需求,我們知道它有三個指標域,分別指向父節點,左結點,右結點,還有乙個資料域。另外需要個性化一些建構函式,滿足不同的需求。

1 template 

2struct

bnode

8 bnode(const t&x) : datum(x), left(null), right(null),parent(null){}

9 ~bnode()

10 };

實現完結點結構後,後序的工作是需要定製二叉樹類。根據需求,一般來說要實現:查詢,插入,刪除,遍歷,求長度,深度,長度等操作。同時,很重要的是要有乙個結點類的head指標提供資料訪問的介面。我們把類設計如下:

template

class

bitree

~bitree();

void

clear();

void init(const t array, int len, bnode* n = null, int beg=1

); // 根據陣列來初始化乙個滿二叉樹

void preorder(const bnode* node) const

; // 遍歷次序

void inorder(const bnode* node) const

;

void postorder(const bnode* node) const

;

void preorder() const

;

void inorder() const

;

void postorder() const

; bnode

*& root() const // 這裡為啥要返回乙個指標的引用呢?

bnode

* insert(bnode* &node, const t& x, inserttype t =right); // 左插or右插

bitree

& erase(bnode* &node, t&carry);

bool search(const t& x) const

; // 呼叫內部_search介面,預設從根結點開始

int size(bnode*) const

;

bool isempty()

int depth(bnode* node) const

;

int height(bnode* node) const

;};

其中有七個地方用到了遞迴,分別是三個遍歷,兩個求長度、高度,搜尋,還有個初始化:

template

void bitree::init( const t array, int len, bnode* n, int

beg)

else

}}template

bitree

::~bitree()

template

void bitree::clear() // 銷毀一棵樹

}template

bool bitree::_search(const t& x, bnode* n) const

template

bool bitree::search(const t& x) const

// 呼叫內部介面,預設從根結點開始

template

bnode

* bitree::insert(bnode* &node, const t& x, inserttype t /*

= inserttype::right

*/) // 插入到某結點的左or右

if( t ==inserttype::right)

inode->parent =node;

++totalsize;

return

inode;

}template

// 用到了乙個技巧,就是交換欲銷毀結點和某個子孫葉結點的值,然後銷毀該子孫結點,這樣樹結構基本不變bitree

& bitree::erase(bnode* &node, t&carry)

if(p->right !=null)

}node->datum = p->datum;

if(p == p->parent->left)

else

delete p;

--totalsize;

return *this;}

template

// 某個結點的大小

int bitree::size(bnode* node) const

template

// 深度

int bitree::depth(bnode* node) const

return

dep;

}template

// 高度

int bitree::height(bnode* node) const

return

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

}template

//先序

void bitree::preorder(const bnode* node) const

}template

void bitree::preorder() const

//中序

template

void bitree::inorder(const bnode* node) const

}template

void bitree::inorder() const

// 後序

template

void bitree::postorder(const bnode* node) const

}template

void bitree::postorder() const

測試**如下:

1 #include 2 #include "

bitree.h"3

using

namespace

std;

4int

main()

511 btree.init(a,10

);12 cout << "

preorder: ";

13btree.preorder ();

14 cout << "

inorder: ";

15btree.inorder();

16 cout << "

postorder: ";

17btree.postorder();

18 cout << "

size of root is

"<< btree.size(btree.root())<19 cout << "

depth of root is

"<< btree.depth(btree.root())<20 cout << "

height of root is

"<< btree.height(btree.root()) <21 cout << "

is 40 exist?

"<< btree.search(40) <22 cout << "

is 6 exist

"<< btree.search(6) <23 }

資料結構 二叉樹 反轉二叉樹

include using namespace std define maxsize 1000 struct binary tree node class queue queue queue void queue push binary tree node btn binary tree node ...

《資料結構》 二叉樹

二叉樹 是 n個結點的有限集,它或為空集,或由乙個根結點及兩棵互不相交的 分別稱為該根的左子樹和右子樹的二叉樹組成。二叉樹不是樹的特殊情況,這是兩種不同的資料結構 它與無序樹和度為 2的有序樹不同。二叉樹的性質 1 二叉樹第 i層上的結點數最多為 2 i 1 2 深度為 k的二叉樹至多有 2 k 1...

資料結構 二叉樹

1.二叉樹 二叉樹是一種特殊結構的樹,每個節點中最多有兩個子節點,如圖1所示 圖1 二叉樹 在圖1中的二叉樹裡,a c有兩個子節點,b d有乙個子節點。對於二叉樹還有圖2中的以下情況 圖2 二叉樹的特殊情況 在博文中還介紹了滿二叉樹和完全二叉樹還有其他的特殊二叉樹。2.二叉樹的實現 有兩種實現方式,...