資料結構 樹(一) 樹與二叉樹

2021-10-06 05:22:58 字數 2394 閱讀 5735

二叉樹的儲存結構與基本操作

樹的概念:資料結構中把樹枝分叉樹、樹葉、樹根抽象為結點node),其中樹根抽象為根節點root),且對一棵樹來說最多存在乙個根節點;把樹葉概括為葉子結點leaf);把莖幹和樹枝同一抽象為edge)。樹就被定義為由若干結點和若干邊組成的資料結構,且在樹中的結點不能被邊連線成環。根節點置於最上方,然後向下延伸出若干條邊到達子結點(child)(從而向下形成子樹)。

父親結點、孩子結點、兄弟結點、祖先結點、子孫結點。

① 樹可以沒有結點,這種情況下把樹稱為空樹empty tree)。

② 樹的層次(layer)從根結點開始算起,即根結點為第一層。

③ 把結點的子樹棵數稱為結點的degree),而樹中結點的最大的度稱為樹的度。

對有n個結點的樹,邊數一定是n-1

⑤ 葉子結點被定義為度為0的結點。

⑥ 結點的深度depth)是指從根結點開始自頂向下逐層累加至該結點時的深度值;結點的高度height)是指從最底層葉子結點開始自底向上逐層累加。

⑦ 多棵樹結合在一起稱為森林forest)。

二叉樹的遞迴定義(從自身來定義自身):

① 要麼二叉樹沒有根結點,是一棵空樹。

② 要麼二叉樹由根結點、左子樹、右子樹組成,且左子樹和右子樹都是二叉樹。

每一層的結點個數都達到了當層能到達的最大結點數。

除了最下面一層之外,其餘層的結點個數都達到了當層能達到的最大結點數,且最下面一層只從左至右連續存在若干結點。

二叉樹使用鍊錶來定義。二叉樹的結點有兩條出邊,因此指標域變成了兩個,把這種鍊錶稱為二叉鍊錶。

struct node

;

node* root =

null

;

如果需要新建結點(例如往二叉樹中插入結點的時候),就可以使用:

//生成乙個新的結點,v為結點權值

node*

newnode

(int v)

查詢操作是指在給定資料域的條件下,在二叉樹中找到所有資料域為給定資料域的結點,並將它們的資料域修改為給定的值。

void

search

(node* root,

int x,

int newdata)

二叉樹結點的插入位置就是資料域在二叉樹中查詢失敗的位置。

//insert函式將在二叉樹中插入乙個資料域為x的新結點

//注意根結點指標root要使用引用,否則插入不會成功

void

insert

(node*

&root,

int x)

if(由二叉樹的性質,x應該插在左子樹)

else

}

根結點root指標使用了引用&。在函式中修改root本身會直接修改原變數,如果不加就不能把新結點接到二叉樹上面。(search不用加是因為search修改的是root指向的內容,而不是root本身)。

如何判斷是否要加引用?一般來說,如果函式中需要新建結點,即對二叉樹的結構做出修改,就要加引用;如果只是修改當前已有結點的內容,或僅僅是遍歷樹,就不用加引用

先把需要插入的資料儲存在陣列中,然後再將他們使用insert函式乙個乙個地插入二叉樹中,並最終返回根結點的指標root。

//二叉樹的建立

node*

create

(int data,

int n)

return root;

//返回根結點

}

樹 資料結構實驗之二叉樹一 樹的同構

資料結構實驗之二叉樹一 樹的同構 給定兩棵樹t1和t2。如果t1可以通過若干次左右孩子互換就變成t2,則我們稱兩棵樹是 同構 的。例如圖1給出的兩棵樹就是同構的,因為我們把其中一棵樹的結點a b g的左右孩子互換後,就得到另外一棵樹。而圖2就不是同構的。圖1圖2現給定兩棵樹,請你判斷它們是否是同構的...

資料結構 樹與二叉樹

一 性質 1 在二叉樹中,第i層的結點總數不超過2 i 1 2 深度為h的二叉樹最多有2 h 1個結點 h 1 最少有h個結點 3 對於任意一棵二叉樹,如果其葉結點數為n0,而度數為2的結點總數為n2,則n0 n2 1 4 具有n個結點的完全二叉樹的深度為int log2n 1 5 給定n個節點,能...

資料結構 樹與二叉樹

1 樹的定義 樹是一種 非線性的資料結構。樹是n n 0 個結點的有限集,在任意一棵非空樹中 1 有且僅有乙個特定的被稱為 根 root 的結點 2 當n 1時,其餘結點可分為m m 0 個互不相交的有限集,其中每個集合本身又是一棵樹,並且稱為根的 子樹 subtree 3 每棵子樹也是由唯一的根結...