国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

leetcode100 Same Tree 引發(fā)的對(duì)遍歷?算法的思考

cyrils / 3480人閱讀

摘要:判斷兩棵樹(shù)是否是相同題目要求傳入兩棵樹(shù)的根節(jié)點(diǎn),判斷這兩棵樹(shù)是否相同此題的核心就在于如何遍歷樹(shù)。定義樹(shù)的一種自然方式是遞歸的方式。一棵樹(shù)是一些節(jié)點(diǎn)的集合,這個(gè)集合可以是空集。這個(gè)遍歷算法可以用于場(chǎng)景如,計(jì)算一個(gè)節(jié)點(diǎn)的高度。

判斷兩棵樹(shù)是否是相同

題目要求:傳入兩棵樹(shù)的根節(jié)點(diǎn),判斷這兩棵樹(shù)是否相同
此題的核心就在于如何遍歷樹(shù)。一旦我們解決了這個(gè)問(wèn)題,題目也就迎刃而解了。
下面就來(lái)介紹一下 關(guān)于樹(shù)的一些基本知識(shí)

1.預(yù)備知識(shí)

樹(shù)(tree)可以用幾種方式定義。定義樹(shù)的一種自然方式是遞歸的方式。一棵樹(shù)是一些節(jié)點(diǎn)的集合,這個(gè)集合可以是空集。若不是空集,則樹(shù)由叫做根(root)的節(jié)點(diǎn)r以及0個(gè)或多個(gè)非空子樹(shù)T1,T2...Tk組成,這些子樹(shù)中每一棵的根都被來(lái)自根r的一條有向的邊(edge)所連結(jié)。

節(jié)點(diǎn)的深度: 從根到該節(jié)點(diǎn)的唯一的路徑的長(zhǎng)

二叉樹(shù): 一個(gè)每個(gè)節(jié)點(diǎn)都不能有多于兩個(gè)兒子的樹(shù)
題目中二叉樹(shù)的節(jié)點(diǎn)表示為

   class TreeNode{
        //節(jié)點(diǎn)的值
        int val;
        //左子節(jié)點(diǎn),可以為null
        TreeNode left;
        //右子節(jié)點(diǎn),可以為null
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
2.二叉樹(shù)的遍歷方法

中序遍歷:首先處理左子樹(shù),然后是當(dāng)前節(jié)點(diǎn),最后處理右子樹(shù)。這個(gè)算法的總的運(yùn)行時(shí)間是O(N),這是因?yàn)樵跇?shù)的每一個(gè)節(jié)點(diǎn)處進(jìn)行的工作是常數(shù)時(shí)間,一共有n個(gè)節(jié)點(diǎn),所以運(yùn)行時(shí)間為O(N)

后序遍歷:先處理左子樹(shù),再處理右子樹(shù),然后再處理當(dāng)前節(jié)點(diǎn)。這個(gè)遍歷算法可以用于場(chǎng)景如,計(jì)算一個(gè)節(jié)點(diǎn)的高度。

先序遍歷:先處理當(dāng)前節(jié)點(diǎn),在處理左子樹(shù)和右子樹(shù)

層序遍歷:所有深度為d的節(jié)點(diǎn)要在深度d+1的節(jié)點(diǎn)之前重組

    //二叉樹(shù)的中序遍歷 
    //遞歸
    void inOrder(TreeNode node){
        if(node!=null){
            inOrder(node.left);
            visit(node);
            inOrder(node.right);
        }
    }
    
    //二叉樹(shù)的中序遍歷
    //非遞歸 需要利用棧
    void inOrder(TreeNode node){
        Stack s = new Stack();
        TreeNode temp = node;
        for( ; ; ){
            //訪問(wèn)左節(jié)點(diǎn)
            while(temp!=null){
                s.push(temp);
                temp = temp.left;
            }
            
            //從左節(jié)點(diǎn)回來(lái),訪問(wèn)右節(jié)點(diǎn)
            if(!s.isEmpty()){
                temp = s.pop();
                //訪問(wèn)當(dāng)前節(jié)點(diǎn)
                System.out.println(temp.val);
                temp = temp.right;
            }else{
                return;
            }
        }
    }
    //二叉樹(shù)的后序遍歷
    void postOrder(TreeNode node){
        if(node!=null){
            postOrder(node.left);
            postOrder(node.right);
            visit(node);
        }
    }
    
    //二叉樹(shù)的前序遍歷
    void preOrder(TreeNode node){
        if(node!=null){
            visit(node);
            preOrder(node.left);
            preOrder(node.right);
        }
    }
3.本題的解法
**
 * @author rale
 * leetcode100
 * Given two binary trees, write a function to check if they are equal or not.
 * Two binary trees are considered equal if they are structurally identical and the nodes have the same value.
 */
public class SameTree {

    //遞歸 即當(dāng)前值和左右子樹(shù)都相等,則是相同的樹(shù),否則不是
    public boolean isSameTree(TreeNode p, TreeNode q) {
        if(p==null){
            return q==null?true:false;
        }else if(q==null){
            return p==null?true:false;
        }
        if(p.val == q.val){
            return isSameTree(p.left,q.left)&&isSameTree(p.right, q.right);
        }else{
            return false;
        }
    }
    
    //循環(huán) 中序遍歷
    public boolean isSameTree2(TreeNode p, TreeNode q){
        Stack stackP = new Stack();
        Stack stackQ = new Stack();
        if(p!=null){
            stackP.push(p);
        }
        if(q!=null){
            stackQ.push(q);
        }
        while(!stackP.isEmpty() && !stackQ.isEmpty()){
            TreeNode tempP = stackP.pop();
            TreeNode tempQ = stackQ.pop();
            if(tempP.val!=tempQ.val){
                return false;
            }
            if(tempP.right!=null){
                stackP.push(tempP.right);
            }
            if(tempQ.right!=null){
                stackQ.push(tempQ.right);
            }
            if(stackP.size()!=stackQ.size()){
                return false;
            }
            if(tempP.left!=null){
                stackP.push(tempP.left);
            }
            if(tempQ.left!=null){
                stackQ.push(tempQ.left);
            }
            if(stackP.size()!=stackQ.size()){
                return false;
            }
        }
        return stackP.size()==stackQ.size();
    }
    
    public class TreeNode{
        int val;
        TreeNode left;
        TreeNode right;
        TreeNode(int x) { val = x; }
    }
}


想要了解更多開(kāi)發(fā)技術(shù),面試教程以及互聯(lián)網(wǎng)公司內(nèi)推,歡迎關(guān)注我的微信公眾號(hào)!將會(huì)不定期的發(fā)放福利哦~

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/66848.html

相關(guān)文章

  • LeetCode 攻略 - 2019 年 7 月下半月匯總(100 題攻略)

    摘要:月下半旬攻略道題,目前已攻略題。目前簡(jiǎn)單難度攻略已經(jīng)到題,所以后面會(huì)調(diào)整自己,在刷算法與數(shù)據(jù)結(jié)構(gòu)的同時(shí),攻略中等難度的題目。 Create by jsliang on 2019-07-30 16:15:37 Recently revised in 2019-07-30 17:04:20 7 月下半旬攻略 45 道題,目前已攻略 100 題。 一 目錄 不折騰的前端,和咸魚(yú)有什么區(qū)別...

    tain335 評(píng)論0 收藏0
  • LeetCode 攻略 - 2019 年 7 月上半月匯總(55 題攻略)

    摘要:微信公眾號(hào)記錄截圖記錄截圖目前關(guān)于這塊算法與數(shù)據(jù)結(jié)構(gòu)的安排前。已攻略返回目錄目前已攻略篇文章。會(huì)根據(jù)題解以及留言內(nèi)容,進(jìn)行補(bǔ)充,并添加上提供題解的小伙伴的昵稱和地址。本許可協(xié)議授權(quán)之外的使用權(quán)限可以從處獲得。 Create by jsliang on 2019-07-15 11:54:45 Recently revised in 2019-07-15 15:25:25 一 目錄 不...

    warmcheng 評(píng)論0 收藏0
  • leetcode297. Serialize and Deserialize Binary Tree

    摘要:因此題目中的例子的中序遍歷結(jié)果為。但是,標(biāo)準(zhǔn)的中序遍歷并不能使我們將該結(jié)果反構(gòu)造成一棵樹(shù),我們丟失了父節(jié)點(diǎn)和子節(jié)點(diǎn)之間的關(guān)系。這里我們也可以明顯的看出來(lái),中序遍歷需要保存的空值遠(yuǎn)遠(yuǎn)多于廣度優(yōu)先遍歷。 題目要求 Serialization is the process of converting a data structure or object into a sequence of ...

    desdik 評(píng)論0 收藏0
  • [Leetcode] Same Tree Symmetric Tree 相同樹(shù) 對(duì)稱樹(shù)

    摘要:遞歸法復(fù)雜度時(shí)間空間遞歸棧空間思路如果兩個(gè)根節(jié)點(diǎn)一個(gè)為空,一個(gè)不為空,或者兩個(gè)根節(jié)點(diǎn)值不同,說(shuō)明出現(xiàn)了不一樣的地方,返回假。代碼遞歸法復(fù)雜度時(shí)間空間遞歸棧空間思路其實(shí)和寫法是一樣的,是比較兩個(gè)節(jié)點(diǎn)的兩個(gè)左邊,然后再比較兩個(gè)節(jié)點(diǎn)的兩個(gè)右邊。 Same Tree Given two binary trees, write a function to check if they are eq...

    TZLLOG 評(píng)論0 收藏0
  • leetcode449. Serialize and Deserialize BST

    摘要:題目要求將二叉搜索樹(shù)序列化和反序列化,序列化是指將樹(shù)用字符串的形式表示,反序列化是指將字符串形式的樹(shù)還原成原來(lái)的樣子。假如二叉搜索樹(shù)的節(jié)點(diǎn)較多,該算法將會(huì)占用大量的額外空間。 題目要求 Serialization is the process of converting a data structure or object into a sequence of bits so that...

    Honwhy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<