【劍指Offer學習】【面試題59:對稱的二叉樹】
題目:請實現一個函式來判斷一棵二叉樹是不是對稱的。如果一棵二叉樹和它的映象一樣,那麼它是對稱的。
解題思路
通常我們有三種不同的二叉樹遍歷演算法,即前序遍歷、中序遍歷和後序遍歷。在這三種遍歷演算法中,都是先遍歷左子結點再遍歷右子結點。我們是否可以定義一種遍歷演算法,先遍歷右子結點再遍歷左子結點?比如我們針對前序遍歷定義一種對稱的遍歷演算法,即先遍歷父節點,再遍歷它的右子結點,最後遍歷它的左子結點。
我們發現可以用過比較二叉樹的前序遍歷序列和對稱前序遍歷序列來判斷二叉樹是不是對稱的。如果兩個序列一樣,那麼二叉樹就是對稱的。
結點定義
private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode() {
}
public BinaryTreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return val + "";
}
}
程式碼實現
public class Test59 {
private static class BinaryTreeNode {
private int val;
private BinaryTreeNode left;
private BinaryTreeNode right;
public BinaryTreeNode() {
}
public BinaryTreeNode(int val) {
this.val = val;
}
@Override
public String toString() {
return val + "";
}
}
public static boolean isSymmetrical(BinaryTreeNode root) {
return isSymmetrical(root, root);
}
private static boolean isSymmetrical(BinaryTreeNode left, BinaryTreeNode right) {
if (left == null && right == null) {
return true;
}
if (left == null || right == null) {
return false;
}
if (left.val != right.val ) {
return false;
}
return isSymmetrical(left.left, right.right) && isSymmetrical(left.right, right.left);
}
public static void main(String[] args) {
test01();
test02();
}
private static void assemble(BinaryTreeNode node,
BinaryTreeNode left,
BinaryTreeNode right) {
node.left = left;
node.right = right;
}
// 1
// 2 2
// 4 6 6 4
// 8 9 10 11 11 10 9 8
public static void test01() {
BinaryTreeNode n1 = new BinaryTreeNode(1);
BinaryTreeNode n2 = new BinaryTreeNode(2);
BinaryTreeNode n3 = new BinaryTreeNode(2);
BinaryTreeNode n4 = new BinaryTreeNode(4);
BinaryTreeNode n5 = new BinaryTreeNode(6);
BinaryTreeNode n6 = new BinaryTreeNode(6);
BinaryTreeNode n7 = new BinaryTreeNode(4);
BinaryTreeNode n8 = new BinaryTreeNode(8);
BinaryTreeNode n9 = new BinaryTreeNode(9);
BinaryTreeNode n10 = new BinaryTreeNode(10);
BinaryTreeNode n11 = new BinaryTreeNode(11);
BinaryTreeNode n12 = new BinaryTreeNode(11);
BinaryTreeNode n13 = new BinaryTreeNode(10);
BinaryTreeNode n14 = new BinaryTreeNode(9);
BinaryTreeNode n15 = new BinaryTreeNode(8);
assemble(n1, n2, n3);
assemble(n2, n4, n5);
assemble(n3, n6, n7);
assemble(n4, n8, n9);
assemble(n5, n10, n11);
assemble(n6, n12, n13);
assemble(n7, n14, n15);
assemble(n8, null, null);
assemble(n9, null, null);
assemble(n10, null, null);
assemble(n11, null, null);
assemble(n12, null, null);
assemble(n13, null, null);
assemble(n14, null, null);
assemble(n15, null, null);
System.out.println(isSymmetrical(n1));
}
// 1
// 2 2
// 4 5 6 4
// 8 9 10 11 11 10 9 8
public static void test02() {
BinaryTreeNode n1 = new BinaryTreeNode(1);
BinaryTreeNode n2 = new BinaryTreeNode(2);
BinaryTreeNode n3 = new BinaryTreeNode(2);
BinaryTreeNode n4 = new BinaryTreeNode(4);
BinaryTreeNode n5 = new BinaryTreeNode(5);
BinaryTreeNode n6 = new BinaryTreeNode(6);
BinaryTreeNode n7 = new BinaryTreeNode(4);
BinaryTreeNode n8 = new BinaryTreeNode(8);
BinaryTreeNode n9 = new BinaryTreeNode(9);
BinaryTreeNode n10 = new BinaryTreeNode(10);
BinaryTreeNode n11 = new BinaryTreeNode(11);
BinaryTreeNode n12 = new BinaryTreeNode(11);
BinaryTreeNode n13 = new BinaryTreeNode(10);
BinaryTreeNode n14 = new BinaryTreeNode(9);
BinaryTreeNode n15 = new BinaryTreeNode(8);
assemble(n1, n2, n3);
assemble(n2, n4, n5);
assemble(n3, n6, n7);
assemble(n4, n8, n9);
assemble(n5, n10, n11);
assemble(n6, n12, n13);
assemble(n7, n14, n15);
assemble(n8, null, null);
assemble(n9, null, null);
assemble(n10, null, null);
assemble(n11, null, null);
assemble(n12, null, null);
assemble(n13, null, null);
assemble(n14, null, null);
assemble(n15, null, null);
System.out.println(isSymmetrical(n1));
}
}
執行結果
相關推薦
劍指Offer面試題59:對稱二叉樹 Java實現
/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0
【劍指Offer學習】【面試題6 :重建二叉樹】
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如:前序遍歷序列{ 1, 2, 4, 7, 3, 5, 6, 8}和中序遍歷序列{4, 7, 2, 1, 5, 3, 8,6},重建出下圖所示的二叉
【劍指Offer學習】【面試題60:把二叉樹打印出多行】
題目:從上到下按層列印二叉樹,同一層的結點按從左到右的順序列印,每一層列印一行。 解題思路 用一個佇列來儲存將要列印的結點。為了把二叉樹的每一行單獨列印到一行裡,我們需要兩個變數:一個變量表示在當前的層中還沒有列印的結點數,另一個變量表示下一次結
【劍指Offer學習】【面試題62:序列化二叉樹】
題目:請實現兩個函式,分別用來序列化和反序列化二叉樹。 解題思路 通過分析解決前面的面試題6.我們知道可以從前序遍歷和中序遍歷構造出一棵二叉樹。受此啟發,我們可以先把一棵二叉樹序列化成一個前序遍歷序列和一箇中序序列,然後再反序列化時通過這兩個序列
《劍指offer》面試題7:重建二叉樹
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。 二叉樹節點的定義如下: struct BinaryTreeNode { int m_nValue; BinaryTreeNode* m_pLeft; Binar
劍指offer--面試題60:把二叉樹列印成多行
題目描述 從上到下按層列印二叉樹,同一層結點從左至右輸出。每一層輸出一行。 python實現: # -*- coding:utf-8 -*- # class TreeNode: # de
劍指offer面試題7:重建二叉樹(Java實現)
題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重複的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,5,3,8,6},則重建二叉樹並返回。 思路:可以把二叉樹分為左右子樹分別構建,前序
劍指Offer(第二版)面試題7:重建二叉樹
劍指Offer面試題7:重建二叉樹題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建該二叉樹。假設輸入的前序遍歷和中序遍歷中都不包含重複的數字。例如前序遍歷序列為{1,2,4,5,3,7,6}和中序遍歷序列{4,2,5,1,7,3,6},則可以重建一棵二叉樹。如圖所示:
劍指offer——(13)從上往下列印二叉樹
遵從先上後下,先左後右的原則,用if——else遞迴即可。 import java.util.ArrayList; /** public class TreeNode { int val = 0; TreeNode left = null; Tree
劍指offer 31. 不分行從上往下列印二叉樹
從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印。 樣例 輸入如下圖所示二叉樹[8, 12, 2, null, null, 6, null, 4, null, null, null] 8 / \ 12 2 / 6 /
劍指offer(23)——從上往下列印二叉樹
題目 從上往下打印出二叉樹的每個結點,同一層的結點按照從左到右的順序列印 分析 從上到下列印,即就是按層遍歷這棵二叉樹,然後將其節點上的值打印出來。如果該樹只有一個根結點,那麼就直接列印該節點就好,這是一種最極端的情況,可是我們常常遇到的並不是這樣的情況,即就是列印完一個結
劍指offer:數字在排序陣列中出現的次數&二叉樹的深度&平衡二叉樹
37.數字在排序陣列中出現的次數 /* 題目描述 統計一個數字在排序陣列中出現的次數。 */ class Solution { public: int GetNumberOfK(vector<int> data ,int k) {
面試題7:重建二叉樹
style ext str null value var int cti 二叉樹 <?php header("content-type:text/html;charset=utf-8"); /* *重建二叉樹 P62 */ class TreeNode {
【劍指Offer學習】【所有面試題匯總】
tails 超過一半 奇數 正則表達式 detail 刪除 祖先 滑動窗口 翻轉單詞順序 劍指Offer學習 劍指Offer這本書已經學習完了,從中也學習到了不少的東西,現在做一個總的目錄,供自已和大家一起參考,學如逆水行舟,不進則退。只有不斷地學習才能跟上時候,跟得
【劍指Offer學習】【面試題5 : 從尾到頭列印連結串列】【思路】
方案一:(後進先出)遍歷連結串列,再從棧頂開始出個輸出結點的值,此時輸出的結點的順序已經反轉過來了。 先推進棧 再依次取出棧頂元素 方案二:遞迴。 判斷連結串列頭結點是否為空 將 next 結點作為下一次的實參 輸出當前棧頂元素。 缺點:當連結串
【劍指Offer學習】【所有面試題彙總】
劍指Offer學習 劍指Offer這本書已經學習完了,從中也學習到了不少的東西,現在做一個總的目錄,供自已和大家一起參考,學如逆水行舟,不進則退。只有不斷地學習才能跟上時候,跟得上技術的潮流! 目錄 第01-10題 第11-20題 第21-30題
【劍指Offer學習】【面試題4 : 替換空格】【思路】
題目: 請實現一個函式,將一個字串中的每個空格替換成“%20”。例如,當字串為We Are Happy,則經過替換之後的字串為We%20Are%20Happy。 思路: 遍歷的方向兩邊皆可。 若從後往前遍歷,新的字串需要反轉。 用 String 類的方法判斷字串
【劍指Offer學習】【面試題5 : 從尾到頭列印連結串列】
題目:輸入個連結串列的頭結點,從尾到頭反過來打印出每個結點的值。 public class Test05 { /** * 結點物件 */ public s
【劍指Offer學習】【面試題26:複雜連結串列的複製】
題目:請實現函式ComplexListNode clone(ComplexListNode head),複製一個複雜連結串列。在複雜連結串列中,每個結點除了有一個next 域指向下一個結點外,還有一個sibling 指向連結串列中的任意結點或者null。
【劍指Offer學習】【面試題56:連結串列中環的入口結點】
題目:一個連結串列中包含環,如何找出環的入口結點? 解題思路 可以用兩個指標來解決這個問題。先定義兩個指標P1和P2指向連結串列的頭結點。如果連結串列中環有n個結點,指標P1在連結串列上向前移動n步,然後兩個指標以相同的速度向前移動。當第二個指標