Java學(xué)習(xí)筆記(五)- 手寫二叉樹排序

學(xué)習(xí)的最好方式就是寫出來

歡迎光臨我的個人小窩:http://wsfss.top

今天我們就手?jǐn)]一個二叉樹排序吧

先來看看二叉樹的相關(guān)知識

  • 每個節(jié)點最多只有2個子節(jié)點
  • 遍歷元素口訣:前序遍歷视卢,根->左->右虑绵、中序遍歷碌更,左->根->右禀苦、后序遍歷,左->右->根
  • 排序機制:依次從根節(jié)點往下比較搀玖,小于當(dāng)前節(jié)點值則走左子節(jié)點绪励,大于當(dāng)前節(jié)點值則走右子節(jié)點铐炫,然后用中序遍歷

1挖函、下面對一組數(shù)字進(jìn)行排序:4状植、2、1怨喘、5、3振定、6必怜,按排序機制添加元素,結(jié)果如下圖

1.png

2后频、然后使用中序遍歷

2.png

3梳庆、接下來通過代碼實現(xiàn)

package com.fss.util.tree.binarytree.impl;

import com.fss.util.tree.binarytree.Tree;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

public class BinaryTreeSort implements Tree<Integer> {

    // 根節(jié)點
    private Node<Integer> root;

    public BinaryTreeSort() {
    }

    /**
     * 依次從根節(jié)點往下比較,小于當(dāng)前節(jié)點值則走左子節(jié)點卑惜,大于當(dāng)前節(jié)點值則走右子節(jié)點
     */
    @Override
    public boolean add(Integer i) {
        Node<Integer> node = new Node<>(i);
        // 根節(jié)點不存在
        if (root == null) {
            root = node;
            return true;
        }
        Node<Integer> newNode = new Node<>(i, null, null);
        Node<Integer> parent = parent(null, i);
        if (Integer.compare(i, parent.value) == -1) {
            parent.left = newNode;
        } else {
            parent.right = newNode;
        }

        return true;
    }

    /**
     * 利用中序遍歷來排序
     */
    @Override
    public void sort(List<Integer> list) {
        list.forEach(v -> {
            add(v);
        });
        List<Integer> sortList = new ArrayList<>();
        ldr(root, sortList);
        System.out.println("sortList: "+ sortList.stream().map(v -> String.valueOf(v)).collect(Collectors.joining(",")));
    }

    /**
     * 遞歸計算雙親位置
     * 當(dāng)前節(jié)點的子節(jié)點不存在時膏执,則當(dāng)前節(jié)點為其雙親
     */
    private Node<Integer> parent(Node<Integer> node, Integer i) {
        Node<Integer> parent = node == null ? root : node;
        if (Integer.compare(i, parent.value) == -1) {
            return parent.left == null ? parent : parent(parent.left, i);
        } else {
            return parent.right == null ? parent : parent(parent.right, i);
        }
    }

    /**
     * 前序遍歷,根->左->右
     */
    private void rld(Node<Integer> node, List<Integer> sortList) {
        if (node != null) {
            sortList.add(node.value);
            rld(node.left, sortList);
            rld(node.right, sortList);
        }
    }

    /**
     * 中序遍歷露久,左->根->右
     */
    private void ldr(Node<Integer> node, List<Integer> sortList) {
        if (node != null) {
            ldr(node.left, sortList);
            sortList.add(node.value);
            ldr(node.right, sortList);
        }
    }

    /**
     * 后序遍歷更米,左->右->根
     */
    private void lrd(Node<Integer> node, List<Integer> sortList) {
        if (node != null) {
            lrd(node.left, sortList);
            lrd(node.right, sortList);
            sortList.add(node.value);
        }
    }

    /**
     * 二叉樹節(jié)點類
     */
    class Node<E> {

        // 節(jié)點內(nèi)容
        private E value;

        // 左節(jié)點
        private Node<E> left;

        // 右節(jié)點
        private Node<E> right;

        public Node() {
        }

        public Node(E value) {
            this.value = value;
        }

        public Node(E value, Node<E> left, Node<E> right) {
            this.value = value;
            this.left = left;
            this.right = right;
        }
    }

}

4、來個測試類

package test;

import com.fss.util.tree.binarytree.impl.BinaryTreeSort;

import java.util.Arrays;
import java.util.List;

public class BinaryTreeTest {

    public static void main(String[] args) {
        List<Integer> list = Arrays.asList(4,2,1,5,3,6);
        BinaryTreeSort binaryTreeSort = new BinaryTreeSort();
        binaryTreeSort.sort(list);
    }

}

5毫痕、打印結(jié)果

sortList: 1,2,3,4,5,6
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末征峦,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子消请,更是在濱河造成了極大的恐慌栏笆,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臊泰,死亡現(xiàn)場離奇詭異蛉加,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進(jìn)店門针饥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來厂抽,“玉大人,你說我怎么就攤上這事打厘⌒蕹Γ” “怎么了?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵户盯,是天一觀的道長嵌施。 經(jīng)常有香客問我,道長莽鸭,這世上最難降的妖魔是什么吗伤? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮硫眨,結(jié)果婚禮上足淆,老公的妹妹穿的比我還像新娘。我一直安慰自己礁阁,他們只是感情好巧号,可當(dāng)我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著姥闭,像睡著了一般丹鸿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上棚品,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天靠欢,我揣著相機與錄音,去河邊找鬼铜跑。 笑死门怪,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的锅纺。 我是一名探鬼主播掷空,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼伞广!你這毒婦竟也來了拣帽?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤嚼锄,失蹤者是張志新(化名)和其女友劉穎减拭,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體区丑,經(jīng)...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡拧粪,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年修陡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可霎。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡魄鸦,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出癣朗,到底是詐尸還是另有隱情拾因,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布旷余,位于F島的核電站绢记,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏正卧。R本人自食惡果不足惜蠢熄,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望炉旷。 院中可真熱鬧签孔,春花似錦、人聲如沸窘行。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽罐盔。三九已至判耕,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間翘骂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工帚豪, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留碳竟,地道東北人。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓狸臣,卻偏偏與公主長得像莹桅,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子烛亦,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內(nèi)容