結點的度:
乙個結點含有的子樹的個數稱為該結點的度
葉結點:
度為0的結點稱為葉結點,也可以叫做終端結點
分支結點:
度不為0的結點稱為分支結點,也可以叫做非終端結點
結點的層次:
從根結點開始,根結點的層次為1,根的直接後繼層次為2,以此類推
結點的層序編號:
將樹中的結點,按照從上層到下層,同層從左到右的次序排成乙個線性序列,把他們編成連續的自然數
樹的度:
樹中所有結點的度的最大值
樹的高度(深度):
樹中結點的最大層次
森林:m(m>=0)個互不相交的樹的集合,將一顆非空樹的根結點刪去,樹就變成乙個森林;給森林增加乙個統一的根
結點,森林就變成一棵樹
孩子結點:
乙個結點的直接後繼結點稱為該結點的孩子結點
雙親結點(父結點):
乙個結點的直接前驅稱為該結點的雙親結點
兄弟結點:
同一雙親結點的孩子結點間互稱兄弟結點
概念:二叉樹就是度不超過2的樹(每個結點最多有兩個子結點)
分類:
二叉查詢樹
public class 二叉樹
system.out.println("-------------前序遍歷-------------");
// 中序遍歷
system.out.println("-------------中序遍歷-------------");
queue queue2 = binarytree.midergodic();
for (object o : queue2)
system.out.println("-------------中序遍歷-------------");
// 後序遍歷
system.out.println("-------------後序遍歷-------------");
queue queue3 = binarytree.prevergodic();
for (object o : queue3)
system.out.println("-------------後序遍歷-------------");
// 層序遍歷
system.out.println("-------------層序遍歷-------------");
queue queue4 = binarytree.layerergodic();
for (object o : queue4)
system.out.println("-------------層序遍歷-------------");
// 最大深度
system.out.println("-------------最大深度-------------");
system.out.println(binarytree.maxdepth());
system.out.println("-------------最大深度-------------");
system.out.println("最小鍵 --> " + binarytree.getminkey());
system.out.println("最大鍵 --> " + binarytree.getmaxkey());
system.out.println(binarytree.isempty());
system.out.println(binarytree.size());
binarytree.iter();
binarytree.delete(1);
binarytree.delete(2);
binarytree.delete(4);
binarytree.delete(5);
binarytree.delete(3);
system.out.println(binarytree.isempty());
system.out.println(binarytree.size());
binarytree.iter();
binarytree.put(3, "zs");
binarytree.put(1, "xy");
binarytree.iter();
}}class binarytree
}// 根節點
private noderoot = null;
private int count = 0;
public int size()
public void put(key key, value value)
private node put(nodenode, key key, value value) else else if (cmp < 0) else
}return node;
}public value get(key key)
private value get(nodenode, key key)
int cmp = key.compareto(node.key);
if (cmp > 0) else if (cmp < 0)
return (value) node.value;
}public void iter()
iter(root);
}private void iter(nodenode)
system.out.println(node.key + "->" + node.value);
if (node.right != null)
}public boolean isempty()
public void delete(key key) else if (size() == 1) else
count--;
}private nodedelete(nodenode, key key)
int cmp = key.compareto(node.key);
if (cmp > 0) else if (cmp < 0) else
if (node.right == null)
if (node.left == null)
node minnode = node.right;
while (minnode.left != null)
node minlastnode = node.right;
while (minlastnode.left != null) else
}if (minlastnode == node.right) else
if (node == root)
node = minnode;
}return node;
}// 獲取最小鍵
public key getminkey()
// 獲取最大鍵
public key getmaxkey()
// 獲取最小鍵
private node getminkey(node node) else
}// 獲取最大鍵
private node getmaxkey(node node) else
}// 前序遍歷
// 獲取整個樹種所有的鍵
public queue preergodic()
//獲取指定樹中的所有鍵,並放到佇列中
public void preergodic(node node, queue keys)
keys.enqueue(node.key);
if (node.left != null)
if (node.right != null)
}// 中序遍歷
// 獲取整個樹種所有的鍵
public queue midergodic()
//獲取指定樹中的所有鍵,並放到佇列中
public void midergodic(node node, queue keys)
if (node.left != null)
keys.enqueue(node.key);
if (node.right != null)
}// 後序遍歷
// 獲取整個樹種所有的鍵
public queue prevergodic()
//獲取指定樹中的所有鍵,並放到佇列中
public void prevergodic(node node, queue keys)
if (node.left != null)
if (node.right != null)
keys.enqueue(node.key);
}// 層序遍歷
public queuelayerergodic()
if (dequeue.object.right != null)
}return keys;
}// 最大深度
public int maxdepth()
private int maxdepth(node node)
if (node.right != null)
max = maxl > maxr ? maxl + 1 : maxr + 1;
return max;
}}
資料結構與演算法 樹
後序遍歷 已知前序和中序求後序 設計 的原則 1 有且僅有乙個根節點 2 所有的子樹也滿足該要求 子樹之間不能有交集 單個節點也是一棵樹 空樹 啥資料都沒有,沒有任何節點 根節點 父節點,子節點,兄弟節點 如果兩個節點的父節點雖不相同,但是它們的父節點處在同一層次上,那麼這兩個節點是兄弟節點 葉子節...
演算法與資料結構 樹
搜尋 如上圖所示 圓圈代表結點,連線結點的線代表邊。樹由結點和連線結點的邊組成。2 有根結點的父子關係 如圖根結點為0,連線根結點0到結點4最後一條邊連線著結點1和4,則結點1稱為結點4的父節點,結點4 為結點1 的子節點。結點2,3為結點4的兄弟結點。3 根結點 沒有父節點的結點 唯一 外部結點 ...
資料結構與演算法(樹)
1 樹的定義 2 基本術語 3 樹的性質 1 二叉樹定義及特性 2 二叉樹的儲存結構 1 二叉樹遍歷 1 樹的儲存結構 2 樹 森林 二叉樹的轉換 樹轉換為二叉樹的規則 每個節點左指標指向它的第乙個孩子,右指標指向它在樹種的相鄰右兄弟。根節點沒有兄弟,所以對應二叉樹沒有右子樹。樹轉換為二叉樹的方法 ...