27、28:二叉樹的鏡像

習(xí)慣github pages風(fēng)格的請(qǐng)看我的另一篇博客

題目27:

  1. 二叉樹的鏡像
  2. 對(duì)稱的二叉樹

題目:二叉樹的鏡像

請(qǐng)完成一個(gè)函數(shù),輸入一個(gè)二叉樹曹货,該函數(shù)輸出它的鏡像。

二叉樹節(jié)點(diǎn)

    public static class BinaryTreeNode {
        int value;
        BinaryTreeNode left;
        BinaryTreeNode right;
        public BinaryTreeNode(){
        }
        public BinaryTreeNode(int value){
            this.value = value;
        }
    }

舉例說明

原二叉樹:(中序遍歷:5 6 7 8 9 10 11)

         8
       /  \
      6    10
     / \   / \
    5  7   9 11

鏡像二叉樹:(中序遍歷:11 10 9 8 7 6 5)

         8
       /   \
      10    6
     / \   / \
    11 9  7  5

思路

二叉樹的鏡像相當(dāng)于是將每個(gè)含有子結(jié)點(diǎn)的結(jié)點(diǎn)的左右子結(jié)點(diǎn)進(jìn)行交換健爬。利用遞歸實(shí)現(xiàn)控乾。

左右子結(jié)點(diǎn)進(jìn)行交換

代碼實(shí)現(xiàn)

public class _27{
    public static class BinaryTreeNode {
        int value;
        BinaryTreeNode left;
        BinaryTreeNode right;
        public BinaryTreeNode(){
        }
        public BinaryTreeNode(int value){
            this.value = value;
        }
    }

    public static void mirrorRecursively(BinaryTreeNode node){
        if(node == null) {
            return; 
        }
        if(node.left == null && node.right == null) {
            return; 
        }
        BinaryTreeNode temp = node.left;
        node.left= node.right;
        node.right = temp;
        if(node.left != null)
            mirrorRecursively(node.left);
        if(node.right != null)
            mirrorRecursively(node.right);
    }


    public static void printTree(BinaryTreeNode node) {
        if (node != null) {
            printTree(node.left);
            System.out.print(node.value + " ");
            printTree(node.right);
        }
    }

    public static void main(String[] args) {
        //       8
        //    /    \
        //   6     10
        //  / \   / \
        // 5   7 9  11
        BinaryTreeNode n1 = new BinaryTreeNode(8);
        BinaryTreeNode n2 = new BinaryTreeNode(6);
        BinaryTreeNode n3 = new BinaryTreeNode(10);
        BinaryTreeNode n4 = new BinaryTreeNode(5);
        BinaryTreeNode n5 = new BinaryTreeNode(7);
        BinaryTreeNode n6 = new BinaryTreeNode(9);
        BinaryTreeNode n7 = new BinaryTreeNode(11);
        n1.left = n2;
        n1.right = n3;
        n2.left = n4;
        n2.right = n5;
        n3.left = n6;
        n3.right = n7;
        printTree(n1);
        System.out.println();
        mirrorRecursively(n1);
        printTree(n1);
    }
}
二叉樹的鏡像

題目:對(duì)稱的二叉樹

請(qǐng)實(shí)現(xiàn)一個(gè)函數(shù),用來判斷一棵二叉樹是不是對(duì)稱的娜遵。如果二叉樹和它的鏡像一樣蜕衡,那么它是對(duì)稱的。

舉例說明

         8
       /  \
      6    10
     / \   / \
    5  7   9 11 不是對(duì)稱的二叉樹
         8
       /  \
      6    6
     / \   / \
    5  7   7 5  是對(duì)稱的二叉樹

思路

如果一顆二叉樹是對(duì)稱的,需要滿足:

  1. 當(dāng)前節(jié)點(diǎn)的值相等
  2. 節(jié)點(diǎn)的左子樹對(duì)稱慨仿,節(jié)點(diǎn)的右子樹對(duì)稱
    注意這里的對(duì)稱久脯,是說鏡像相同。而鏡像與原來的是反的镰吆。即左子樹的左子樹與右子樹的右子樹相同帘撰。

代碼實(shí)現(xiàn)

public class _28{
    public static class BinaryTreeNode {
        int value;
        BinaryTreeNode left;
        BinaryTreeNode right;
        public BinaryTreeNode(){
        }
        public BinaryTreeNode(int value){
            this.value = value;
        }
    }
    
    public static boolean isSymmetrical(BinaryTreeNode Root) {
        if (Root == null)
            return true;
        return isSymmetrical(Root.left, Root.right);
    }
    
    private static boolean isSymmetrical(BinaryTreeNode left, BinaryTreeNode right) {
        if (left == null && right == null)//都是空
            return true;
        if (left == null || right == null)//只有一個(gè)空
            return false;
        if (left.value != right.value)
            return false;
        return isSymmetrical(left.left, right.right) && isSymmetrical(left.right, right.left);
    }
    
    public static void main(String[] args) {
        BinaryTreeNode n1 = new BinaryTreeNode(8);
        BinaryTreeNode n2 = new BinaryTreeNode(6);
        BinaryTreeNode n3 = new BinaryTreeNode(10);
        BinaryTreeNode n4 = new BinaryTreeNode(5);
        BinaryTreeNode n5 = new BinaryTreeNode(7);
        BinaryTreeNode n6 = new BinaryTreeNode(9);
        BinaryTreeNode n7 = new BinaryTreeNode(11);
        n1.left = n2;
        n1.right = n3;
        n2.left = n4;
        n2.right = n5;
        n3.left = n6;
        n3.right = n7;
        System.out.println(isSymmetrical(n1));
        BinaryTreeNode n8 = new BinaryTreeNode(8);
        BinaryTreeNode n9 = new BinaryTreeNode(6);
        BinaryTreeNode n10 = new BinaryTreeNode(6);
        BinaryTreeNode n11 = new BinaryTreeNode(5);
        BinaryTreeNode n12 = new BinaryTreeNode(7);
        BinaryTreeNode n13 = new BinaryTreeNode(7);
        BinaryTreeNode n14 = new BinaryTreeNode(5);
        n8.left = n9;
        n8.right = n10;
        n9.left = n11;
        n9.right = n12;
        n10.left = n13;
        n10.right = n14;
        System.out.println(isSymmetrical(n8));
    }
}

非遞歸:

import java.util.Stack;

public class _28 {
    public static class BinaryTreeNode {
        int value;
        BinaryTreeNode left;
        BinaryTreeNode right;

        public BinaryTreeNode() {
        }

        public BinaryTreeNode(int value) {
            this.value = value;
        }
    }

    public static boolean isSymmetrical(BinaryTreeNode root) {
        if (root == null) {
            return true;
        }
        Stack<BinaryTreeNode> stack = new Stack<BinaryTreeNode>();
        stack.push(root.left);
        stack.push(root.right);
        while (!stack.empty()) {
            BinaryTreeNode p1 = stack.pop();
            BinaryTreeNode p2 = stack.pop();
            if (p1 == null && p2 == null) {
                continue;
            }
            if (p1 == null || p2 == null || p1.value != p2.value) {
                return false;
            }
            stack.push(p1.left);
            stack.push(p2.right);
            stack.push(p1.right);
            stack.push(p2.left);
        }
        return true;
    }

    public static void main(String[] args) {
        BinaryTreeNode n1 = new BinaryTreeNode(8);
        BinaryTreeNode n2 = new BinaryTreeNode(6);
        BinaryTreeNode n3 = new BinaryTreeNode(10);
        BinaryTreeNode n4 = new BinaryTreeNode(5);
        BinaryTreeNode n5 = new BinaryTreeNode(7);
        BinaryTreeNode n6 = new BinaryTreeNode(9);
        BinaryTreeNode n7 = new BinaryTreeNode(11);
        n1.left = n2;
        n1.right = n3;
        n2.left = n4;
        n2.right = n5;
        n3.left = n6;
        n3.right = n7;
        System.out.println(isSymmetrical(n1));
        BinaryTreeNode n8 = new BinaryTreeNode(8);
        BinaryTreeNode n9 = new BinaryTreeNode(6);
        BinaryTreeNode n10 = new BinaryTreeNode(6);
        BinaryTreeNode n11 = new BinaryTreeNode(5);
        BinaryTreeNode n12 = new BinaryTreeNode(7);
        BinaryTreeNode n13 = new BinaryTreeNode(7);
        BinaryTreeNode n14 = new BinaryTreeNode(5);
        n8.left = n9;
        n8.right = n10;
        n9.left = n11;
        n9.right = n12;
        n10.left = n13;
        n10.right = n14;
        System.out.println(isSymmetrical(n8));
    }
}
對(duì)稱的二叉樹
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市万皿,隨后出現(xiàn)的幾起案子摧找,更是在濱河造成了極大的恐慌,老刑警劉巖牢硅,帶你破解...
    沈念sama閱讀 222,252評(píng)論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蹬耘,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡减余,警方通過查閱死者的電腦和手機(jī)综苔,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來位岔,“玉大人如筛,你說我怎么就攤上這事∈闾В” “怎么了杨刨?”我有些...
    開封第一講書人閱讀 168,814評(píng)論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)瞧剖。 經(jīng)常有香客問我拭嫁,道長(zhǎng),這世上最難降的妖魔是什么抓于? 我笑而不...
    開封第一講書人閱讀 59,869評(píng)論 1 299
  • 正文 為了忘掉前任做粤,我火速辦了婚禮,結(jié)果婚禮上捉撮,老公的妹妹穿的比我還像新娘怕品。我一直安慰自己,他們只是感情好巾遭,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評(píng)論 6 398
  • 文/花漫 我一把揭開白布肉康。 她就那樣靜靜地躺著,像睡著了一般灼舍。 火紅的嫁衣襯著肌膚如雪吼和。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評(píng)論 1 312
  • 那天骑素,我揣著相機(jī)與錄音炫乓,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛末捣,可吹牛的內(nèi)容都是我干的侠姑。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼箩做,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼莽红!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起邦邦,我...
    開封第一講書人閱讀 39,924評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤安吁,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后圃酵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柳畔,經(jīng)...
    沈念sama閱讀 46,469評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評(píng)論 3 342
  • 正文 我和宋清朗相戀三年郭赐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片确沸。...
    茶點(diǎn)故事閱讀 40,680評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡捌锭,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出罗捎,到底是詐尸還是另有隱情观谦,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評(píng)論 5 351
  • 正文 年R本政府宣布桨菜,位于F島的核電站豁状,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏倒得。R本人自食惡果不足惜泻红,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評(píng)論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望霞掺。 院中可真熱鬧谊路,春花似錦、人聲如沸菩彬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)骗灶。三九已至惨恭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間耙旦,已是汗流浹背脱羡。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人轻黑。 一個(gè)月前我還...
    沈念sama閱讀 49,099評(píng)論 3 378
  • 正文 我出身青樓糊肤,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親氓鄙。 傳聞我的和親對(duì)象是個(gè)殘疾皇子馆揉,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評(píng)論 2 361

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