二叉樹按層遍歷-插入-刪除

三個(gè)問題

  1. 二叉樹按層遍歷
  2. 給定指定n個(gè)節(jié)點(diǎn),二叉樹有多少種組合
  3. 二叉樹插入刪除竹握,保持順序

思路

  1. 通過隊(duì)列保存緩存結(jié)果画株,從root節(jié)點(diǎn)開始,然后進(jìn)隊(duì)出隊(duì),輸出結(jié)果同時(shí)左節(jié)點(diǎn)進(jìn)隊(duì)右節(jié)點(diǎn)進(jìn)隊(duì)谓传,直到隊(duì)列為空蜈项。
public void printByLayer() {
        Queue<TreeStruct> queue = new LinkedList<>();
        queue.offer(this);
        TreeStruct temp;
        while (queue.size() > 0) {
            temp = queue.poll();
            assert temp != null;
            System.out.println(temp.value);
            if (temp.left != null) {
                queue.offer(temp.left);
            }
            if (temp.right != null) {
                queue.offer(temp.right);
            }
        }
    }
  1. 對(duì)于第二個(gè)問題,已看到就會(huì)想到n续挟!紧卒。但是二叉樹不是完全二叉樹。
    卡特蘭數(shù)
    f(0)=1;f(1) = 1;
    n個(gè)數(shù)字诗祸,1個(gè)在根節(jié)點(diǎn)其他可能情況跑芳。0個(gè)在左,n-1個(gè)在右直颅;1個(gè)在左博个,n-2個(gè)在右;2個(gè)在左际乘,n-3個(gè)在右坡倔。。脖含。
    f(n) = f(0)f(n-1) + f(1)f(n-2) + ... + f(n-2)f(1) + f(n-1)f(0)
    Cn = (2n)!/((n+1)!*n!)

  2. 插入node罪塔,大于等于在右葉子,小于根節(jié)點(diǎn)在左葉子养葵。刪除節(jié)點(diǎn)征堪,1.左右節(jié)點(diǎn)空,直接刪除关拒;2.左節(jié)點(diǎn)空佃蚜,右節(jié)點(diǎn)不為空,找到右節(jié)點(diǎn)中最小的替換到刪除節(jié)點(diǎn)位置着绊;3.左節(jié)點(diǎn)不為空谐算,右節(jié)點(diǎn)為空,找到左節(jié)點(diǎn)中最大的替換到刪除節(jié)點(diǎn)位置归露;4.左右節(jié)點(diǎn)都不為空洲脂,同3一樣

Code

public class TreeStruct {

    public TreeStruct() {
    }

    public TreeStruct(Integer value) {
        this.value = value;
    }

    private Integer value;
    private TreeStruct left;
    private TreeStruct right;

    /**
     * 按層輸出
     */
    public void printByLayer() {
        Queue<TreeStruct> queue = new LinkedList<>();
        queue.offer(this);
        TreeStruct temp;
        while (queue.size() > 0) {
            temp = queue.poll();
            assert temp != null;
            System.out.println(temp.value);
            if (temp.left != null) {
                queue.offer(temp.left);
            }
            if (temp.right != null) {
                queue.offer(temp.right);
            }
        }
    }

    public void printByLayer(Consumer<Integer> consumer) {
        Queue<TreeStruct> queue = new LinkedList<>();
        queue.offer(this);
        TreeStruct temp;
        while (queue.size() > 0) {
            temp = queue.poll();
            assert temp != null;
            consumer.accept(temp.value);
            if (temp.left != null) {
                queue.offer(temp.left);
            }
            if (temp.right != null) {
                queue.offer(temp.right);
            }
        }
    }

    /**
     * 遍歷
     */
    public void travel() {
        travelRecursion(this);
    }
    /**
     * 前序遍歷
     */
    private void travelRecursion(TreeStruct node) {
        if (node != null) {
            System.out.println(node.value);
            travelRecursion(node.getLeft());
            travelRecursion(node.getRight());
        }
    }

    /**
     * 查找
     */
    public TreeStruct find(Integer value) {
        TreeStruct node = this;
        while (node != null) {
            if (node.getValue() > value) {
                node = node.getLeft();
            } else if (node.getValue() < value) {
                node = node.getRight();
            } else {
                return node;
            }
        }
        return null;
    }

    /**
     * 插入node,大于等于在右葉子剧包,小于根節(jié)點(diǎn)在左葉子
     */
    public void insertNode(Integer value) {
        TreeStruct node = this;
        while (node != null) {
            if (node.getValue() == null) {
                node.setValue(value);
                break;
            }
            if (node.getValue() < value) {
                if (node.getRight() == null) {
                    node.setRight(new TreeStruct(value));
                    node = null;
                } else {
                    node = node.getRight();
                }
            } else {
                if (node.getLeft() == null) {
                    node.setLeft(new TreeStruct(value));
                    node = null;
                } else {
                    node = node.getLeft();
                }
            }
        }
    }

    /**
     * 刪除1個(gè)節(jié)點(diǎn)恐锦,不刪除重復(fù)數(shù)據(jù)
     */
    public void deleteNode(Integer value) {
        TreeStruct pre = null;
        TreeStruct node = this;
        while (node != null) {
            if (node.getValue() > value) {
                pre = node;
                node = node.getLeft();
            } else if(node.getValue() < value) {
                pre = node;
                node = node.getRight();
            } else {
                if (node.getLeft() == null) {
                    if (node.getRight() == null) {
                        if (pre == null) {
                            this.value = null;
                        } else {
                            if (pre.getLeft() == node) {
                                pre.setLeft(null);
                            } else if (pre.getRight() == node){
                                pre.setRight(null);
                            }
                        }
                    } else {
                        // left == null && right != null
                        // find right minimum element
                        TreeStruct tempPre = null;
                        TreeStruct temp = node.getRight();
                        while (temp.getLeft() != null) {
                            tempPre = temp;
                            temp = temp.getLeft();
                        }
                        // remove temp
                        if (tempPre != null) {
                            tempPre.setLeft(null);
                        } else {
                            node.setRight(null);
                        }
                        // move temp to node
                        temp.setLeft(node.getLeft());
                        temp.setRight(node.getRight());
                        if (pre != null) {
                            if (pre.getLeft() == node) {
                                pre.setLeft(temp);
                            } else if (pre.getRight() == node) {
                                pre.setRight(temp);
                            }
                        }
                    }
                } else {
                    // left != null && right == null || left != null && right != null
                    // find left maximum element
                    TreeStruct tempPre = null;
                    TreeStruct temp = node.getLeft();
                    while (temp.getRight() != null) {
                        tempPre = temp;
                        temp = temp.getRight();
                    }
                    // remove temp
                    if (tempPre != null) {
                        tempPre.setRight(null);
                    } else {
                        node.setLeft(null);
                    }
                    // move temp to node
                    temp.setLeft(node.getLeft());
                    temp.setRight(node.getRight());
                    if (pre != null) {
                        if (pre.getLeft() == node) {
                            pre.setLeft(temp);
                        } else if (pre.getRight() == node) {
                            pre.setRight(temp);
                        }
                    } else {
                        this.value = temp.getValue();
                    }
                }
                break;
            }
        }
    }

    /**
     * 數(shù)高
     */
    public Integer height() {
        return height(this);
    }

    private Integer height(TreeStruct treeStruct) {
        if (treeStruct == null) {
            return 0;
        } else {
            Integer leftHeight = height(treeStruct.getLeft());
            Integer rightHeight = height(treeStruct.getRight());
            return leftHeight >= rightHeight ? leftHeight + 1 : rightHeight + 1;
        }
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市疆液,隨后出現(xiàn)的幾起案子一铅,更是在濱河造成了極大的恐慌,老刑警劉巖堕油,帶你破解...
    沈念sama閱讀 211,639評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件潘飘,死亡現(xiàn)場(chǎng)離奇詭異肮之,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)卜录,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門局骤,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人暴凑,你說我怎么就攤上這事∽咐矗” “怎么了现喳?”我有些...
    開封第一講書人閱讀 157,221評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)犬辰。 經(jīng)常有香客問我嗦篱,道長(zhǎng),這世上最難降的妖魔是什么幌缝? 我笑而不...
    開封第一講書人閱讀 56,474評(píng)論 1 283
  • 正文 為了忘掉前任灸促,我火速辦了婚禮,結(jié)果婚禮上涵卵,老公的妹妹穿的比我還像新娘浴栽。我一直安慰自己,他們只是感情好轿偎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評(píng)論 6 386
  • 文/花漫 我一把揭開白布典鸡。 她就那樣靜靜地躺著,像睡著了一般坏晦。 火紅的嫁衣襯著肌膚如雪萝玷。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評(píng)論 1 290
  • 那天昆婿,我揣著相機(jī)與錄音球碉,去河邊找鬼。 笑死仓蛆,一個(gè)胖子當(dāng)著我的面吹牛睁冬,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播多律,決...
    沈念sama閱讀 38,957評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼痴突,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了狼荞?” 一聲冷哼從身側(cè)響起辽装,我...
    開封第一講書人閱讀 37,718評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎相味,沒想到半個(gè)月后拾积,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,176評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評(píng)論 2 327
  • 正文 我和宋清朗相戀三年拓巧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了斯碌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肛度,死狀恐怖傻唾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情承耿,我是刑警寧澤冠骄,帶...
    沈念sama閱讀 34,322評(píng)論 4 330
  • 正文 年R本政府宣布,位于F島的核電站加袋,受9級(jí)特大地震影響凛辣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜职烧,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評(píng)論 3 313
  • 文/蒙蒙 一扁誓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蚀之,春花似錦蝗敢、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至壹堰,卻和暖如春拭卿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背贱纠。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評(píng)論 1 266
  • 我被黑心中介騙來泰國(guó)打工峻厚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谆焊。 一個(gè)月前我還...
    沈念sama閱讀 46,358評(píng)論 2 360
  • 正文 我出身青樓惠桃,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親辖试。 傳聞我的和親對(duì)象是個(gè)殘疾皇子辜王,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評(píng)論 2 348

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