二叉樹的儲存結構與基本操作
樹的概念:資料結構中把樹枝分叉樹、樹葉、樹根抽象為結點(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 每棵子樹也是由唯一的根結...