什麼是樹?java
樹是節點的有限集合。node
名詞普及:算法
一、孩子:當前節點下的全部第一級節點,就是當前節點的孩子。數組
如上所示:post
A節點的孩子有B、C、D; B節點的孩子有 D、E;spa
C節點沒有孩子; D節點的孩子有G、H指針
二、雙親節點(父節點):當前節點的上一級節點對象
如上所示:B是A的孩子,即B是A的雙親blog
三、祖先:從根到該節點所經分支上的全部節點;索引
如上所示:
E的祖先有:B、A; F的祖先有:B、A;
G的祖先有:D、A; H的祖先有:D、A;
B的祖先有:A; C的祖先有:A ;
D的祖先有:A;
4、兄弟節點:具備相同父節點的節點互稱爲兄弟節點;
如上所示:
B、C、D互爲兄弟節點;E、F互爲兄弟節點; G、H互爲兄弟節點;
5、堂兄弟節點:雙親在同一層的節點互爲堂兄弟;
如上所示:
E、G互爲堂兄弟節點; E、H互爲堂兄弟節點;
F、G互爲堂兄弟節點; F、H互爲堂兄弟節點;
六、度:當前節點下,孩子的數量就是該節點的度
如上所示:
A節點的度爲3;B節點的度爲2;C節點的度爲0;D節點的度爲2;EFGH的度爲0;
七、葉子(終端節點):沒有孩子的節點,即度爲0的節點就是終端節點
如上所示:
C、E、F、G、H爲終端節點;
八、根(非終端節點):有孩子的節點,即度不爲0的節點就是根
如上所示:
A、B、D爲終端節點;
九、有序樹:樹中任意節點的子結點之間有順序關係,這種樹稱爲有序樹;
十、無序樹:樹中任意節點的子結點之間沒有順序關係,這種樹稱爲無序樹,也稱爲自由樹;
11、二叉樹:每一個節點最多含有兩個子樹的樹稱爲二叉樹;
十二、深度:定義一棵樹的根結點層次爲1,其餘節點的層次是其父結點層次加1。一棵樹中全部結點的層次的最大值稱爲這棵樹的深度。
節點的深度:當前節點所在的層數
如上所示:A的深度爲1;B、C、D的深度爲2;E、F、G、H的深度爲3
樹的深度:取樹中全部節點深度最大的深度
如上所示:E的深度爲3,其餘全部節點的深度,沒有更大的,因此該樹的深度爲3‘
1三、森林:由m(m>=0)棵互不相交的樹(獨立的樹)的集合稱爲森林;
二叉樹
數組實現
數組與二叉樹之間的算法轉換:
父節點的下標 * 2 + 1 = 左子節點;
父節點的下標 * 2 + 2 = 右子節點;
鏈表實現
節點要素:索引,數據,左孩子指針,右孩子指針,父節點指針
前序遍歷:根、左、右
中序遍歷:左、根、右
後序遍歷:左、右、根
附上二叉樹的建立代碼:
package util; import test.entity.TreeNode; public class MyBinaryTree { private TreeNode myBinaryTree; /** * 初始化二叉樹 */ public MyBinaryTree () { myBinaryTree = new TreeNode(); } /** * 搜索樹節點 * @param nodeIndex * @return */ public TreeNode SearchNode (int nodeIndex){ return myBinaryTree.SearchNode(nodeIndex); } /** * 添加樹節點 * @param nodeIndex * @param direction * @param treeNode * @return */ public TreeNode addNode(int nodeIndex, int direction, TreeNode treeNode){ TreeNode node = SearchNode(nodeIndex); if (node == null){ return null; } //若是直接使用外面傳進來的對象treeNode那麼當該對象在外面被進行操做時,可能會使該對象失去了所擁有的完整性,因此此處咱們新申請了一個對象用於存放treeNode的值 TreeNode newNode = new TreeNode(); newNode.index = treeNode.index; newNode.data = treeNode.data; if (direction == 0){ node.pLChild = newNode; } if (direction == 1){ node.pRChild = newNode; } newNode.pParent = node; return newNode; } /** * 刪除樹節點 * @param nodeIndex * @return */ public TreeNode deleteNode(int nodeIndex){ TreeNode node = SearchNode(nodeIndex); if (node == null){ return null; } TreeNode temp = new TreeNode(); temp.index = node.index; temp.data = node.data; node.deleteNode(); return temp; } /** * 前序遍歷 */ public void preorderTraversal(){ myBinaryTree.preorderTraversal(); } /** * 中序遍歷 */ public void inorderTraversal(){ myBinaryTree.inorderTraversal(); } /** * 後序遍歷 */ public void postorderTraversal(){ myBinaryTree.postorderTraversal(); } }