9.17~9.18刷題總結(jié)

找到中序遍歷二叉樹下一個(gè)節(jié)點(diǎn)
分析二叉樹的下一個(gè)節(jié)點(diǎn),一共有以下情況:
1.二叉樹為空焚鹊,則返回空腕够;
2.節(jié)點(diǎn)右孩子存在逊脯,則設(shè)置一個(gè)指針從該節(jié)點(diǎn)的右孩子出發(fā)优质,一直沿著指向左子結(jié)點(diǎn)的指針找到的葉子節(jié)點(diǎn)即為下一個(gè)節(jié)點(diǎn);
3.節(jié)點(diǎn)不是根節(jié)點(diǎn)军洼。如果該節(jié)點(diǎn)是其父節(jié)點(diǎn)的左孩子巩螃,則返回父節(jié)點(diǎn);否則繼續(xù)向上遍歷其父節(jié)點(diǎn)的父節(jié)點(diǎn)匕争,重復(fù)之前的判斷避乏,返回結(jié)果。代碼如下

    //8,6,10,5,7,9,11
    /*
     * 給定一個(gè)二叉樹和其中的一個(gè)結(jié)點(diǎn)甘桑,請找出中序遍歷順序的下一個(gè)結(jié)點(diǎn)并且返回拍皮。
     * 注意,樹中的結(jié)點(diǎn)不僅包含左右子結(jié)點(diǎn)跑杭,同時(shí)包含指向父結(jié)點(diǎn)的指針春缕。
     */
    public TreeLinkNode GetNext(TreeLinkNode pNode)
    {
        if(pNode==null)
            return null;
        if(pNode.right!=null){//如果有右子樹,找右子樹的最左節(jié)點(diǎn)
            TreeLinkNode p=pNode.right;
            while(p.left!=null){
                p=p.left;
            }
            return p;
        }
        while(pNode.next!=null){//沒右子樹艘蹋,則找第一個(gè)當(dāng)前結(jié)點(diǎn)是父節(jié)點(diǎn)左孩子的節(jié)點(diǎn)
            if(pNode.next.left==pNode)//節(jié)點(diǎn)不是根節(jié)點(diǎn)。如果該節(jié)點(diǎn)是其父節(jié)點(diǎn)的左孩子票灰,則返回父節(jié)點(diǎn)女阀;否則繼續(xù)向上遍歷
                return pNode.next;
            pNode=pNode.next;
        }
       return null;
    }
    
class TreeLinkNode {
    int val;
    TreeLinkNode left = null;
    TreeLinkNode right = null;
    TreeLinkNode next = null;

    TreeLinkNode(int val) {
        this.val = val;
    }
}

之字形打印二叉樹
利用棧后進(jìn)先出的特性,兩個(gè)棧一個(gè)存奇數(shù)層節(jié)點(diǎn)屑迂,一個(gè)存偶數(shù)層節(jié)點(diǎn)

    /*
     * 請實(shí)現(xiàn)一個(gè)函數(shù)按照之字形打印二叉樹浸策,即第一行按照從左到右的順序打印,
     * 第二層按照從右至左的順序打印惹盼,第三行按照從左到右的順序打印庸汗,其他行以此類推。
     */
    //{8,6,10,5,7,9,11}
    public static ArrayList<ArrayList<Integer>> Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> all=new ArrayList<ArrayList<Integer>>();  
        int layer=1;
        Stack<TreeNode> s1=new Stack<TreeNode>();
        Stack<TreeNode> s2=new Stack<TreeNode>();
        s1.push(pRoot);
        while(!s1.empty()||!s2.empty()){
            if(layer%2!=0){
                ArrayList<Integer> temp=new ArrayList<Integer>();
                while(!s1.empty()){
                    TreeNode node=s1.pop();
                    if(node!=null){
                        temp.add(node.val);
                        System.out.print(node.val + " ");
                        s2.push(node.left);
                        s2.push(node.right);
                    }
                }
                if(!temp.isEmpty()){
                    all.add(temp);
                    layer++;
                    System.out.println();
                }
            }else{
                ArrayList<Integer> temp=new ArrayList<Integer>();
                while(!s2.empty()){
                    TreeNode node=s2.pop();
                    if(node!=null){
                        temp.add(node.val);
                        System.out.print(node.val + " ");
                        s1.push(node.right);
                        s1.push(node.left);
                    }
                }
                if(!temp.isEmpty()){
                    all.add(temp);
                    layer++;
                    System.out.println();
                }
            }
            
        }
        return all;
    }

多行打印二叉樹

    public ArrayList<ArrayList<Integer> > Print(TreeNode pRoot) {
        ArrayList<ArrayList<Integer>> result=new ArrayList<ArrayList<Integer>>();   
        if(pRoot==null)
            return result;
        Queue<TreeNode> layer=new LinkedList<>();
        ArrayList<Integer> list=new ArrayList<Integer>();
       layer.add(pRoot);
       int start=0,end=1;
       while(!layer.isEmpty()){
           TreeNode cur=layer.remove();
           list.add(cur.val);
           start++;
           if(cur.left!=null)
               layer.add(cur.left);
           if(cur.right!=null)
               layer.add(cur.right);
           if(start==end){
               end=layer.size();
               start=0;
               result.add(list);
               list=new ArrayList<>();
           }
       }
       return result;
    }

反轉(zhuǎn)鏈表

方法一

//反轉(zhuǎn)鏈表  
    ListNode reverseNode(ListNode phead){
        ListNode preverhead=null;//保存翻轉(zhuǎn)后的頭結(jié)點(diǎn) 是原始鏈表的尾結(jié)點(diǎn)
        ListNode pnode=phead;//當(dāng)前節(jié)點(diǎn)
        ListNode pprev=null;//當(dāng)前節(jié)點(diǎn)的左一個(gè)節(jié)點(diǎn)
        while(pnode!=null){
            ListNode pnext=pnode.next;//當(dāng)前節(jié)點(diǎn)的下一個(gè)節(jié)點(diǎn)
            if(pnext==null)
                preverhead=pnode;
            pnode.next=pprev;
            pprev=pnode;
            pnode=pnext;
        }
        return preverhead;
    }

方法二

public ListNode ReverseList(ListNode head) {
        if(head==null)
            return null;
        ListNode pre=null;
        ListNode next=null;
        while(head!=null){
            next=head.next;
            head.next=pre;
            pre=head;
            head=next;
        }
        return pre;
    }

合并兩個(gè)有序鏈表

方法一 遞歸

    //合并兩個(gè)有序鏈表
    public ListNode merge(ListNode node1,ListNode node2){
        if(node1==null)
            return node2;
        else if(node2==null)
            return node1;
        ListNode p=null;
        if(node1.val<node2.val){
            p=node1;
            p.next=merge(node1.next,node2);
        }else{
            p=node2;
            p.next=merge(node2.next,node1);
        }
        return p;
    }

方法二 新建一個(gè)頭結(jié)點(diǎn)

//新建一個(gè)頭結(jié)點(diǎn)的方式 合并有序鏈表
    public ListNode Merge(ListNode list1,ListNode list2) {
           ListNode head=new ListNode(-1);
           head.next=null;
           ListNode root=head;
           while(list1!=null&&list2!=null){
               if(list1.val<list2.val){
                   head.next=list1;
                   head=list1;
                   list1=list1.next;
               }else{
                   head.next=list2;
                   head=list2;
                   list2=list2.next;
               }
           }
           if(list1!=null)
               head.next=list1;
           if(list2!=null)
               head.next=list2;
           return root.next;
       }

方法三 先賦值第一個(gè)節(jié)點(diǎn)

    //先賦值第一個(gè)節(jié)點(diǎn)
    public ListNode Merge2(ListNode list1,ListNode list2) {
           ListNode head=null;
          if(list1.val<=list2.val){
             head=list1;
             list1=list1.next;              
          }else{
              head=list2;
              list2=list2.next;
          }
          ListNode p=head;
           while(list1!=null&&list2!=null){
               if(list1.val<list2.val){
                   p.next=list1;
                   list1=list1.next;                 
               }else{
                   p.next=list2;
                   list2=list2.next;                 
               }
               p=p.next;
           }
           if(list1!=null)
               p.next=list1;
           if(list2!=null)
               p.next=list2;
           return head;
       }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末手报,一起剝皮案震驚了整個(gè)濱河市蚯舱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌掩蛤,老刑警劉巖枉昏,帶你破解...
    沈念sama閱讀 218,122評(píng)論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異揍鸟,居然都是意外死亡兄裂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來晰奖,“玉大人谈撒,你說我怎么就攤上這事∝夷希” “怎么了啃匿?”我有些...
    開封第一講書人閱讀 164,491評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長午衰。 經(jīng)常有香客問我立宜,道長,這世上最難降的妖魔是什么臊岸? 我笑而不...
    開封第一講書人閱讀 58,636評(píng)論 1 293
  • 正文 為了忘掉前任橙数,我火速辦了婚禮,結(jié)果婚禮上帅戒,老公的妹妹穿的比我還像新娘灯帮。我一直安慰自己,他們只是感情好逻住,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,676評(píng)論 6 392
  • 文/花漫 我一把揭開白布钟哥。 她就那樣靜靜地躺著,像睡著了一般瞎访。 火紅的嫁衣襯著肌膚如雪腻贰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評(píng)論 1 305
  • 那天扒秸,我揣著相機(jī)與錄音播演,去河邊找鬼。 笑死伴奥,一個(gè)胖子當(dāng)著我的面吹牛写烤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播拾徙,決...
    沈念sama閱讀 40,292評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼洲炊,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了尼啡?” 一聲冷哼從身側(cè)響起暂衡,我...
    開封第一講書人閱讀 39,211評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎崖瞭,沒想到半個(gè)月后古徒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡读恃,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評(píng)論 3 336
  • 正文 我和宋清朗相戀三年隧膘,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了代态。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,965評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡疹吃,死狀恐怖蹦疑,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情萨驶,我是刑警寧澤歉摧,帶...
    沈念sama閱讀 35,684評(píng)論 5 347
  • 正文 年R本政府宣布,位于F島的核電站腔呜,受9級(jí)特大地震影響叁温,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜核畴,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評(píng)論 3 329
  • 文/蒙蒙 一膝但、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧谤草,春花似錦跟束、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至温学,卻和暖如春略贮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仗岖。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評(píng)論 1 269
  • 我被黑心中介騙來泰國打工刨肃, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箩帚。 一個(gè)月前我還...
    沈念sama閱讀 48,126評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像黄痪,于是被迫代替她去往敵國和親紧帕。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評(píng)論 2 355

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

  • 樹的概述 樹是一種非常常用的數(shù)據(jù)結(jié)構(gòu)桅打,樹與前面介紹的線性表是嗜,棧,隊(duì)列等線性結(jié)構(gòu)不同挺尾,樹是一種非線性結(jié)構(gòu) 1.樹的定...
    Jack921閱讀 4,455評(píng)論 1 31
  • 第一章 緒論 什么是數(shù)據(jù)結(jié)構(gòu)鹅搪? 數(shù)據(jù)結(jié)構(gòu)的定義:數(shù)據(jù)結(jié)構(gòu)是相互之間存在一種或多種特定關(guān)系的數(shù)據(jù)元素的集合。 第二章...
    SeanCheney閱讀 5,771評(píng)論 0 19
  • B樹的定義 一棵m階的B樹滿足下列條件: 樹中每個(gè)結(jié)點(diǎn)至多有m個(gè)孩子遭铺。 除根結(jié)點(diǎn)和葉子結(jié)點(diǎn)外丽柿,其它每個(gè)結(jié)點(diǎn)至少有m...
    文檔隨手記閱讀 13,221評(píng)論 0 25
  • 1 序 2016年6月25日夜恢准,帝都,天下著大雨甫题,拖著行李箱和同學(xué)在校門口照了最后一張合照馁筐,搬離寢室打車去了提前租...
    RichardJieChen閱讀 5,103評(píng)論 0 12
  • 數(shù)據(jù)結(jié)構(gòu)和算法--二叉樹的實(shí)現(xiàn) 幾種二叉樹 1、二叉樹 和普通的樹相比坠非,二叉樹有如下特點(diǎn): 每個(gè)結(jié)點(diǎn)最多只有兩棵子...
    sunhaiyu閱讀 6,461評(píng)論 0 14