1. 程式人生 > >Java基礎知識複習(十)-- 二叉樹排序

Java基礎知識複習(十)-- 二叉樹排序

二叉樹

二叉樹由各種節點組成
二叉樹特點:
每個節點都可以有左子節點,右子節點
每一個節點都有一個值

二叉樹排序

假設通過二叉樹對如下10個隨機數進行排序
67,7,30,73,10,0,78,81,10,74
排序的第一個步驟是把資料插入到該二叉樹中,插入基本邏輯是,小、相同的放左邊,大的放右邊

  1. 67 放在根節點
  2. 7 比 67小,放在67的左節點
  3. 30 比67 小,找到67的左節點7,30比7大,就放在7的右節點
  4. 73 比67大, 放在67得右節點
  5. 10 比 67小,找到67的左節點7,10比7大,找到7的右節點30,10比30小,放在30的左節點。 … …
  6. 10比67小,找到67的左節點7,10比7大,找到7的右節點30,10比30小,找到30的左節點10,10和10一樣大,放在左邊
    在這裡插入圖片描述

遍歷二叉樹

通過上一個步驟的插入行為,實際上,資料就已經排好序了。 接下來要做的是看,把這些已經排好序的資料,遍歷成我們常用的List或者陣列的形式

二叉樹的遍歷分先序,中序,後序
先序即: 先遍歷根節點,再依次遍歷左子樹,右子樹
中序即: 先遍歷左子樹,再依次遍歷根節點,右子樹
後序即: 先遍歷左右子樹,再遍歷根節點

參考程式碼

package review5;

import java.util.ArrayList;
import java.util.List; public class Node { public Node leftNode; public Node rightNode; public int value; public void add(int v) { // 當前節點為空 if(value == 0) { value = v; } //當前節點不為空 else { //插入值小於等於當前節點值,放到二叉樹左邊 if(v <= value) { //左子樹為空 if(leftNode == null) { leftNode =
new Node(); } leftNode.add(v); } //插入值大於等於當前節點值,放到二叉樹右邊 else { if(rightNode == null) { rightNode = new Node(); } rightNode.add(v); } } } public List<Integer> values(){ //中序遍歷 List<Integer> values = new ArrayList<>(); //遍歷左子樹 if(leftNode != null) { values.addAll(leftNode.values()); } //當前節點 values.add(value); //遍歷右子樹 if (rightNode != null) { values.addAll(rightNode.values()); } return values; } public static void main(String[] args) { int[] a = new int[10]; for(int i = 0; i < 10; i++) { a[i] = (int) (Math.random()*100+1); } Node root = new Node(); for(int num : a) { root.add(num); System.out.print(num+","); } System.out.println(); System.out.println(root.values()); } }