基本概念 樹
除了根節點之外,每個節點只要一個父節點,根節點沒有父節點。除了分葉節點之外,所有節點都有一個或者多個節點,分葉節點沒有子節點。父節點和子節點之間用指標相連。 二叉樹
所謂二叉樹是樹的一種特殊結構,在二叉樹中每個節點最多隻能擁有兩個子節點。
二叉樹具有以下性質: 非空二叉樹的第n層上至多有2^(n-1)個元素。 深度為h的二叉樹至多有2^h-1個結點。 資料結構定義
public class BTNode { int val; //值 BTNode left; //左子樹 BTNode right; //右子樹 public BTNode(){ } public BTNode(int val){ this.val = val; } public BTNode(int val, BTNode left, BTNode right) { this.val = val; this.left = left; this.right = right; }}二叉樹操作 遍曆
遍曆即將樹的所有結點訪問且僅訪問一次。按照根節點位置的不同分為前序走訪,中序遍曆,後序遍曆。 前序走訪:先訪問根結點,再訪問左子結點,最後訪問右子結點 中序遍曆:先訪問左子結點,再訪問根結點,最後訪問右子結點 後序遍曆:先訪問左子結點,再訪問右子結點,最後訪問根結點
如下圖所示二叉樹
前序走訪:10 6 4 2 8 14 12 16
中序遍曆:2 4 6 8 10 12 14 16
後序遍曆:2 4 8 6 12 16 14 10 代碼實現 前序走訪
/** * 前序走訪 * 先訪問根結點,再訪問左子結點,最後訪問右子結點 * @param root */ public void preorder(BTNode root){ //先訪問根結點 System.out.print(root.val+" "); if(root.left!=null){ preorder(root.left); } if(root.right!=null){ preorder(root.right); } }中序遍曆
/** * 中序遍曆 * 先訪問左子結點,再訪問根結點,最後訪問右子結點 * @param root */ public void middleorder(BTNode root){ //先訪問左子結點 if(root.left!=null){ middleorder(root.left); } System.out.print(root.val+" "); if(root.right!=null){ middleorder(root.right); } }後序遍曆
/** * 後序遍曆 * 先訪問左子結點,再訪問右子結點,最後訪問根結點 * @param root */ public void lastorder(BTNode root){ if(root.left!=null){ lastorder(root.left); } if(root.right!=null){ lastorder(root.right); } System.out.print(root.val+" "); }層次遍曆
/** * 層次遍曆 * @param root */ public void layerorder(BTNode root){ if(root==null){ return; } //隊列,先進先出 Queue<BTNode> queue = new LinkedList<>(); queue.add(root); while(!queue.isEmpty()){ BTNode node = queue.poll(); System.out.print(node.val+" "); if(node.left!=null){ queue.add(node.left); } if(node.right!=null){ queue.add(node.right); } } }擷取二叉樹的高度
/** * 擷取二叉樹的高度 * @param root * @return */ public int getHeight(BTNode root){ if(root==null){ return 0; } int left = getHeight(root.left); int right = getHeight(root.right); int h = (left>right?left:right)+1; return h; }擷取二叉樹結點的數量
/** * 擷取二叉樹結點的數量 * @param root * @return */ public int getCount(BTNode root){ if(root==null){ return 0; } return getCount(root.left)+getCount(root.right)+1; }判斷兩棵 二叉樹 是否相等
/** * 判斷兩棵 二叉樹 是否相等 * @param root1 * @param root2 * @return */ public boolean equals(BTNode root1, BTNode root2){ if((root1==null && root2==null) ||root1.val == root2.val){ return true; } if(equals(root1.left, root2.left) && equals(root1.right, root2.right)){ return true; } return false; }測試代碼
//構造上圖中的二叉樹 BTNode node8 = new BTNode(2); BTNode node4 = new BTNode(4, node8, null); BTNode node5 = new BTNode(8); BTNode node2 = new BTNode(6, node4, node5); BTNode node6 = new BTNode(12); BTNode node7 = new BTNode(16); BTNode node3 = new BTNode(14, node6, node7); BTNode root = new BTNode(10, node2, node3); System.out.println("前序走訪:"); preorder(root); System.out.println("--------------"); System.out.println("中序遍曆:"); middleorder(root); System.out.println("--------------"); System.out.println("後序遍曆:"); lastorder(root); System.out.println("--------------"); System.out.println("層次遍曆:"); layerorder(root); System.out.println("--------------"); System.out.println("結點數量:"+getCount(root)); System.out.println("--------------"); System.out.println("高度:"+getHeight(root));