1.樹的常用概念
根節點、葉子節點、父節點、子節點、兄弟節點,還有節點的高度、深度以及層數,樹的高度。
2.概念解釋
節點:樹中的每個元素稱為節點
父子關係:相鄰兩節點的連線,稱為父子關係
根節點:沒有父節點的節點
葉子節點:沒有子節點的節點
父節點:指向子節點的節點
子節點:被父節點指向的節點
兄弟節點:具有相同父節點的多個節點稱為兄弟節點關係
節點的高度:節點到葉子節點的最長路徑所包含的邊數
節點的深度:根節點到節點的路徑所包含的邊數
節點的層數:節點的深度+1(根節點的層數是1)
樹的高度:等於根節點的高度
1.概念
①什麼是二叉樹?
每個節點最多只有2個子節點的樹,這兩個節點分別是左子節點和右子節點。
②什麼是滿二叉樹?
有一種二叉樹,除了葉子節點外,每個節點都有左右兩個子節點,這種二叉樹叫做滿二叉樹。
③什麼是完全二叉樹?
有一種二叉樹,葉子節點都在最底下兩層,最後一層葉子節都靠左排列,並且除了最後一層,其他層的節點個數都要達到最大,這種二叉樹叫做完全二叉樹。
2.完全二叉樹的儲存
①鏈式儲存
每個節點由3個字段,其中乙個儲存資料,另外兩個是指向左右子節點的指標。我們只要拎住根節點,就可以通過左右子節點的指標,把整棵樹都串起來。這種儲存方式比較常用,大部分二叉樹**都是通過這種方式實現的。
②順序儲存
用陣列來儲存,對於完全二叉樹,如果節點x儲存在陣列中的下標為i,那麼它的左子節點的儲存下標為2i,右子節點的下標為2i+1,反過來,下標i/2位置儲存的就是該節點的父節點。注意,根節點儲存在下標為1的位置。完全二叉樹用陣列來儲存時最省記憶體的方式。
3.二叉樹的遍歷
①前序遍歷:對於樹中的任意節點來說,先列印這個節點,然後再列印它的左子樹,最後列印它的右子樹。
②中序遍歷:對於樹中的任意節點來說,先列印它的左子樹,然後再列印它的本身,最後列印它的右子樹。
③後序遍歷:對於樹中的任意節點來說,先列印它的左子樹,然後再列印它的右子樹,最後列印它本身。
前序遍歷的遞推公式:
preorder(r) = print r->preorder(r->left)->preorder(r->right)
中序遍歷的遞推公式:
inorder(r) = inorder(r->left)->print r->inorder(r->right)
後序遍歷的遞推公式:
postorder(r) = postorder(r->left)->postorder(r->right)->print r
時間複雜度:3種遍歷方式中,每個節點最多會被訪問2次,所以時間複雜度是o(n)。
public
class
tree1
public treenode bulidtree()
//二叉樹前序遍歷
private
void
search1
(treenode root)
}//二叉樹中序遍歷
private
void
search2
(treenode root)
}//二叉樹後序遍歷
private
void
search3
(treenode root)
}}
二叉查詢樹是二叉樹中最常用的一種型別,也叫二叉搜尋樹。二叉查詢樹要求,在樹中的任意乙個節點,其左子樹中的
每個節點的值,都要小於這個節點的值,而右子樹節點的值都大於這個節點的值。
1.二叉查詢樹的查詢操作
我們先取根節點,如果它等於我們要查詢的資料,那就返回。如果要查詢的資料比根節點的值小,那就在左子樹中遞迴查詢;如果要查詢的資料比根節點的值大,那就在右子樹中遞迴查詢。
2.二叉查詢樹的插入操作
二叉查詢樹的插入過程有點類似查詢操作。新插入的資料一般都是在葉子節點上,所以我們只需要從根節點開始,依次比較要插入的資料和節點的大小關係。
如果要插入的資料比節點的資料大,並且節點的右子樹為空,就將新資料直接插到右子節點的位置;如果不為空,就再遞迴遍歷右子樹,查詢插入位置。同理,如果要插入的資料比節點數值小,並且節點的左子樹為空,就將新資料插入到左子節點的位置;如果不為空,就再遞迴遍歷左子樹,查詢插入位置。
3.二叉查詢樹的刪除操作
第一種情況是,如果要刪除的節點沒有子節點,我們只需要直接將父節點中,指向要刪除節點的指標置為 null。比如圖中的刪除節點 55。
第二種情況是,如果要刪除的節點只有乙個子節點(只有左子節點或者右子節點),我們只需要更新父節點中,指向要刪除節點的指標,讓它指向要刪除節點的子節點就可以了。比如圖中的刪除節點 13。
第三種情況是,如果要刪除的節點有兩個子節點,這就比較複雜了。我們需要找到這個節點的右子樹中的最小節點,把它替換到要刪除的節點上。然後再刪除掉這個最小節點,因為最小節點肯定沒有左子節點(如果有左子結點,那就不是最小節點了),所以,我們可以應用上面兩條規則來刪除這個最小節點。比如圖中的刪除節點 18。
4.二叉查詢樹的其他操作
除了插入、刪除、查詢操作之外,二叉查詢樹中還可以支援快速地查詢最大節點和最小節點、前驅節點和後繼節點。
如何通過程式設計,求出一棵給定二叉樹的確切高度呢?
/**
* definition for a binary tree node.
* public class treenode
* }*/class
solution
}
二叉樹 二叉樹
題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...
樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹
目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...
二叉樹,完全二叉樹,滿二叉樹
二叉樹 是n n 0 個結點的有限集合,它或者是空樹 n 0 或者是由乙個根結點及兩顆互不相交的 分別稱為左子樹和右子樹的二叉樹所組成。滿二叉樹 一顆深度為k且有2 k 1個結點的二叉樹稱為滿二叉樹。說明 除葉子結點外的所有結點均有兩個子結點。所有葉子結點必須在同一層上。完全二叉樹 若設二叉樹的深度...