1.樹和森林
樹是一種基本的數據結構。一棵樹只有一個根結點。可以沒有或有多個子結點。每個子結點以及子結點以下的結點又組成了一棵樹,叫做子樹。在一棵樹結構中,只有父結點,沒有子結點的結點叫做葉子結點
森林是多棵互不相交的樹的集合。對樹中的每個結點而言,其子樹的集合就是森林。
2.二叉樹
二叉樹是另一種樹型結構,它的特點是每個結點至多隻有兩棵子樹,並且二叉樹中的子樹還有左右之分,它們的次序不能顛倒。
3.二叉樹結點的表示
Class Node{
private Object data; //結點中存儲的數據
private Node parent; //父結點的引用
private Node lChild; //左結點的引用
private Node rChild; //右結點的引用
}
4.二叉樹的性質
1.在二叉樹的第i層上至多有2^(i-1)個結點(i>=1)
2.深度爲k的二叉樹至多有(2^k)-1個結點(k>=1)
3.對任何一棵二叉樹,如果其終端節點數爲n0,度爲2的結點數爲n2,則n0=n2+1.
設n1爲度爲1的結點樹,則總結點數n=n0+n1+n2
根據度與結點的對應關係有n=n1+2*n2+1(1表示一個根結點)
兩式結合有n0=n2+1
4.具有n個結點的完全二叉樹的深度是[]+1
完全二叉樹形象的理解是它的上一層是滿二叉樹,而下一層要求右側的孩子節點可以也只可以連續缺少,但是左側不能缺少。性質4的證明如下:
假設深度爲k,則該二叉樹爲滿二叉樹時結點最多爲(2^k)-1,最少的情況是最後一層只有一個結點爲2^(k-2)+1。則2^(k-2)+1<=n<=(2^k)-1,即<k<=+1,因爲k是整數所以k=[]+1.
5.二叉排序樹的建立和遍歷
二叉排序樹具有如下性質:1)左子樹上所有結點的值均小於根結點的值2)右子樹上所有結點的值均不小於根結點的值3)左右子樹也分別是二叉排序樹
建立二叉排序樹的代碼如下:
/**
* 將一個整型數組存儲在一個查找二叉樹中
* @param array 被存儲的數組
* @return 查找二叉樹的根節點
*/
public TreeNode arrayToTree(int[] array) {
TreeNode root = new TreeNode(array[0]);
for (int i = 1; i < array.length; i++) {
TreeNode node = new TreeNode(array[i]);
insertNode(node, root);
}
return root;
}
private void insertNode(TreeNode node, TreeNode root) {
if ((Integer) node.getObj() < (Integer) root.getObj()) {
if (root.getLchild() == null){
root.setLchild(node);
}else
insertNode(node, root.getLchild());
} else {
if (root.getRchild() == null){
root.setRchild(node);
}else
insertNode(node, root.getRchild());
}
}
<!--EndFragment-->
遍歷排序二叉樹的代碼如下:
/**
* 中序遍歷二叉樹
* @param root 二叉樹的根節點
*/
public void traverseTree(TreeNode root) {
if (root != null) {
int data = (Integer) root.getObj();
traverseTree(root.getLchild());
System.out.println(data);
traverseTree(root.getRchild());
}
}