算法面試題:逆時針打印二叉樹外圍邊緣

更詳細的講解和代碼調(diào)試演示過程插佛,請參看視頻
用java開發(fā)C語言編譯器

更詳細的講解和代碼調(diào)試演示過程产弹,請參看視頻
如何進入google,算法面試技能全面提升指南

如果你對機器學習感興趣两疚,請參看一下鏈接:
機器學習:神經(jīng)網(wǎng)絡(luò)導(dǎo)論

更詳細的講解和代碼調(diào)試演示過程床估,請參看視頻
Linux kernel Hacker, 從零構(gòu)建自己的內(nèi)核

給定一顆二叉樹如下:


這里寫圖片描述

要求把二叉樹的外邊緣按照逆時針的方式打印出來,也就是你需要打印出以下節(jié)點:
314诱渤, 6丐巫, 271, 28勺美, 0递胧, 17, 641赡茸, 257缎脾, 29 ,278占卧, 7

整個二叉樹的外邊緣分三部分遗菠,第一部分是最左邊緣,也就是節(jié)點314华蜒, 6辙纬, 271, 28叭喜。第二部分是底邊節(jié)點贺拣,他們分別是0, 17捂蕴, 641譬涡, 257, 29启绰。第三部分是右邊緣昂儒,他們分別是7, 278.

左邊緣的節(jié)點從根節(jié)點開始委可,一直訪問左孩子渊跋,直到左孩子為空;
底部節(jié)點實際上是二叉樹的所以葉子節(jié)點着倾;
右邊緣節(jié)點是從根節(jié)點開始拾酝,一直訪問右節(jié)點,直到右孩子為空卡者;

根據(jù)以上三種情況蒿囤,通過遍歷二叉樹,獲得三種性質(zhì)的節(jié)點崇决,把他們組合起來就是二叉樹的逆時針外邊緣了材诽。由此代碼實現(xiàn)如下:

import java.util.ArrayList;
import java.util.Stack;

public class AntiClockWiseTravel {
    
    private ArrayList<TreeNode> antiClockWiseNodeList = new ArrayList<TreeNode>();
    private TreeNode root;
    
    private void getLeftSizeNodes() {
        TreeNode node = root;
        while (node != null) {
            antiClockWiseNodeList.add(node);
            node = node.left;
        }
    }
    
    private void inorder(TreeNode node) {
        if (node == null) {
            return;
        }
        
        inorder(node.left);
        
        if (node.left == null && node.right == null) {
            if (antiClockWiseNodeList.get(antiClockWiseNodeList.size() - 1) != node) {
                antiClockWiseNodeList.add(node);    
            }
            
            return;
        }
        
        inorder(node.right);
    }
    
    private void getBottomSizeNodes() {
        TreeNode node = root;
        inorder(node);
    }
    
    private void getRightSizeNodes() {
        TreeNode node = root;
        Stack<TreeNode> stack = new Stack<TreeNode>();
        
        node = node.right;
        while (node != null) {
            stack.push(node);
            node = node.right;
        }
        
        while (stack.empty() != true) {
            TreeNode n = stack.pop();
            if (antiClockWiseNodeList.get(antiClockWiseNodeList.size() - 1 ) != n) {
                antiClockWiseNodeList.add(n);
            }
        }
    }
    
    public AntiClockWiseTravel(TreeNode root) {
        this.root = root;
        
        getLeftSizeNodes();
        getBottomSizeNodes();
        getRightSizeNodes();
    }
    
    public ArrayList<TreeNode> getAntiClockWiseNodes() {
        return antiClockWiseNodeList;
    }
}

antiClockWiseNodeList是一個二叉樹節(jié)點隊列底挫,專門用來存儲二叉樹外邊緣的節(jié)點,首先我們通過getLeftSizeNodes來獲取左邊緣的幾點脸侥,它實現(xiàn)方法簡單建邓,只是從跟節(jié)點開始,始終訪問左孩子睁枕,并把他們加入隊列官边。

getBottomSizeNodes用來獲得邊緣的底部節(jié)點,它使用中序遍歷二叉樹節(jié)點外遇,每遍歷一個節(jié)點就判斷其是否是葉子節(jié)點注簿,如果是,則把它加入隊列跳仿,這里要注意的是诡渴,底部節(jié)點與左邊緣節(jié)點有可能會發(fā)送重復(fù),例如節(jié)點28既是左邊緣節(jié)點塔嬉,也是底部節(jié)點玩徊,因此加入的時候要做個判斷,代碼中的if判斷谨究,作用就是防止把左邊緣和底部邊緣的重合節(jié)點加入隊列兩次。

函數(shù)getRightSizeNodes目的是獲得右邊緣節(jié)點泣棋,這里需要注意的是胶哲,當我們從根節(jié)點開始,依次訪問右孩子時潭辈,所得節(jié)點的次序是順時針的鸯屿,例如從根節(jié)點開始訪問右邊緣節(jié)點是,節(jié)點次序是7把敢, 278寄摆, 29, 但我們需要的是逆時針次序修赞,也就是說婶恼,我們想要的節(jié)點次序是29, 278柏副, 7勾邦,所以在代碼實現(xiàn)中,使用了一個小技巧割择,當獲得右邊緣節(jié)點時眷篇,先將他們壓入堆棧,因為堆棧的特點是后進先出荔泳,壓入堆棧后再把堆棧中的節(jié)點依次彈出蕉饼,這樣的話我們得到的節(jié)點次序就是逆時針的了虐杯。這里還需要注意的一點是,右邊緣節(jié)點和底部節(jié)點有重復(fù)節(jié)點昧港,例如節(jié)點29就是他們的重復(fù)節(jié)點厦幅,代碼中的if判斷就是為了防止把重復(fù)節(jié)點添加兩次。

我們再看看主入口代碼:

import java.util.ArrayList;


public class BinaryTree {
   public static void main(String[] s) {
       
       int[] inorder = new int[]{28, 271, 0, 6, 561, 17, 3, 314, 2, 401, 641, 1, 257, 7, 278, 29};
       int[] preorder= new int[] {314, 6, 271, 28, 0, 561, 3, 17, 7, 2, 1, 401, 641, 257, 278, 29};
       BTreeBuilder treeBuilder = new BTreeBuilder(inorder, preorder);
       TreeNode root = treeBuilder.getTreeRoot();
       PrintTreeList pt = new PrintTreeList(root);
       pt.printTree();
       
       System.out.print("\n");
       AntiClockWiseTravel at = new AntiClockWiseTravel(root);
       ArrayList<TreeNode> list = at.getAntiClockWiseNodes();
       for (int i = 0; i < list.size(); i++) {
           TreeNode n = list.get(i);
           System.out.print(n.val + " ");
       }
   }
}

首先我們給定二叉樹的中序遍歷節(jié)點和前序遍歷節(jié)點慨飘,上一節(jié)我們給出了如何根據(jù)兩種節(jié)點次序構(gòu)建二叉樹的算法确憨,構(gòu)建出給定的二叉樹后,把二叉樹的根節(jié)點傳遞給AntiClockWiseTravel瓤的,通過該類獲得一個節(jié)點隊列休弃,這個節(jié)點隊列包含了二叉樹以逆時針次序存放的外部邊緣節(jié)點,上面的代碼運行后得到結(jié)果如下:

314 6 271 28 0 17 641 257 29 278 7

由此可見圈膏,我們的算法準確的以逆時針方式打印了二叉樹的外部邊緣節(jié)點塔猾。

更多技術(shù)信息,包括操作系統(tǒng)稽坤,編譯器丈甸,面試算法,機器學習尿褪,人工智能睦擂,請關(guān)照我的公眾號:


這里寫圖片描述
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市杖玲,隨后出現(xiàn)的幾起案子顿仇,更是在濱河造成了極大的恐慌,老刑警劉巖摆马,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件臼闻,死亡現(xiàn)場離奇詭異,居然都是意外死亡囤采,警方通過查閱死者的電腦和手機述呐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蕉毯,“玉大人乓搬,你說我怎么就攤上這事∷×酰” “怎么了缤谎?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長褐着。 經(jīng)常有香客問我坷澡,道長,這世上最難降的妖魔是什么含蓉? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任频敛,我火速辦了婚禮项郊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘斟赚。我一直安慰自己着降,他們只是感情好,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布拗军。 她就那樣靜靜地躺著任洞,像睡著了一般。 火紅的嫁衣襯著肌膚如雪发侵。 梳的紋絲不亂的頭發(fā)上交掏,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機與錄音刃鳄,去河邊找鬼盅弛。 笑死,一個胖子當著我的面吹牛叔锐,可吹牛的內(nèi)容都是我干的挪鹏。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼愉烙,長吁一口氣:“原來是場噩夢啊……” “哼讨盒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起齿梁,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤催植,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后勺择,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡伦忠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年省核,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昆码。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡气忠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赋咽,到底是詐尸還是另有隱情旧噪,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布脓匿,位于F島的核電站淘钟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陪毡。R本人自食惡果不足惜米母,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一勾扭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧铁瞒,春花似錦妙色、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芍碧,卻和暖如春煌珊,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背师枣。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工怪瓶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人践美。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓洗贰,卻偏偏與公主長得像,于是被迫代替她去往敵國和親陨倡。 傳聞我的和親對象是個殘疾皇子敛滋,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355

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

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu),樹與前面介紹的線性表兴革,棧绎晃,隊列等線性結(jié)構(gòu)不同,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,455評論 1 31
  • 本文轉(zhuǎn)自 http://www.cnblogs.com/manji/p/4903990.html二叉樹-****你...
    doublej_yjj閱讀 681評論 0 8
  • 一直以來杂曲,我都很少使用也避免使用到樹和圖,總覺得它們神秘而又復(fù)雜庶艾,但是樹在一些運算和查找中也不可避免的要使用到,那...
    24K男閱讀 6,752評論 5 14
  • 1.什么是二叉樹擎勘? 在計算機科學中咱揍,二叉樹是每個節(jié)點最多有兩個子樹的樹結(jié)構(gòu)。通常子樹被稱作“左子樹”和“右子樹”棚饵,...
    zcaaron閱讀 1,265評論 2 15
  • 什么是二叉樹煤裙? 在計算機科學中,二叉樹是每個節(jié)點最多有兩個子樹的樹結(jié)構(gòu)噪漾。通常子樹被稱作“左子樹”和“右子樹”硼砰,左子...
    小貓仔閱讀 522評論 0 0