1. 程式人生 > >劍指Offer面試題59:對稱二叉樹 Java實現

劍指Offer面試題59:對稱二叉樹 Java實現

/**************************************************************      
* Copyright (c) 2016, 
* All rights reserved.                   
* 版 本 號:v1.0                   
* 題目描述:對稱二叉樹
*   	       請實現一個函式,用來判斷一顆二叉樹是不是對稱的。如果一顆二叉樹和它的映象一樣,那麼它是對稱的。
* 輸入描述:無
* 程式輸出:該二叉樹是否為對稱二叉樹
*			true
* 問題分析: 無
* 演算法描述:通過遞迴函式,來判斷一顆樹的左右節點是否成映象
* 完成日期:2016-10-14
***************************************************************/
package org.marsguo.offerproject59;

class TreeNode{
	int val;
	TreeNode left = null;
	TreeNode right = null;
	
	public TreeNode(int val){
		this.val = val;
	}
}

class IsSymmetrical{
	public boolean isSymmetricalFun(TreeNode root){
		return isSymmetricalFun(root,root);
	}
	
	public boolean isSymmetricalFun(TreeNode root1,TreeNode root2){
		if(root1 == null && root2 == null)
			return true;
		
		if(root1 == null || root2 == null)
			return false;
		
		if(root1.val != root2.val)
			return false;
		
		return isSymmetricalFun(root1.left,root2.right)&&isSymmetricalFun(root1.right, root2.left);			//對稱成映象
	}
}

public class SymmetricalTree {
	public static void main(String[] args){
		IsSymmetrical issymmetrical = new IsSymmetrical();
		
		
		TreeNode n1 = new TreeNode(8);
		TreeNode n2 = new TreeNode(6);
		TreeNode n3 = new TreeNode(6);
		TreeNode n4 = new TreeNode(5);
		TreeNode n5 = new TreeNode(7);
		TreeNode n6 = new TreeNode(7);
		TreeNode n7 = new TreeNode(5);
//		TreeNode n8 = new TreeNode(8);
//		TreeNode n9 = new TreeNode(9);
		
		n1.left = n2;
		n1.right = n3;
		
		n2.left = n4;
		n2.right = n5;
		
		n3.left = n6;
		n3.right = n7;
		
//		n5.left = n8;
//		n5.right = n9;
		
		System.out.println("該二叉樹是否為對稱二叉樹");
		System.out.println(issymmetrical.isSymmetricalFun(n1));
	}
}

程式執行結果:

相關推薦

Offer試題59對稱 Java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0

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試題53正則表示式匹配 Java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0

Offer試題44撲克牌的順子 Java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0

Offer試題66矩陣中的路徑 java實現

/************************************************************** * Copyright (c) 2016, * All rights reserved. * 版 本 號:v1.0

offer----從上到下列印----java實現

題目:從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 思路:其實就是二叉樹的層次遍歷問題,藉助於佇列來實現對二叉樹的層次遍歷 程式碼: import java.util.ArrayList;

offer 試題28對稱 c++

題目:請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。(要想象一下他的結構) 思路:遞迴判斷,左子樹的左子樹和右子樹的右子樹比較,左子樹的右子樹和右子樹的左子樹比較,若相等則是,否則不是。 class Solution { pub

Offer:試題30——最小的k個數(java實現)

問題描述: 輸入n個整數,找出其中最小的k個數 思路1: 先排序,再取前k個 時間複雜度O(nlogn) 下面給出快排序的程式碼(基於下面Partition函式的方法) public void QuickSort(int[]

Offer:試題26——複製複雜的連結串列(java實現)

問題描述: 輸入一個複雜連結串列(每個節點中有節點值,以及兩個指標,一個指向下一個節點,另一個特殊指標指向任意一個節點)。 思路1: 1.先複製連結串列節點,並用next連結起來。

Offer(書)重建

中序 span 問題 找到 div 節點 left 假設 array 題目:輸入某二叉樹的前序遍歷和中序遍歷的結果,請重建出該二叉樹。假設輸入的前序遍歷和中序遍歷的結果中都不含重復的數字。例如輸入前序遍歷序列{1,2,4,7,3,5,6,8}和中序遍歷序列{4,7,2,1,

offer第55.5平衡

題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 class Solution: def IsBalanced_Solution(self, pRoot): # write code here if not pRoot:

offer試題59 對稱java實現

解題思路: 可以定義一種遍歷演算法,先訪問根節點,再遍歷右子樹後遍歷左子樹,可以將這種遍歷方法稱為對稱的前序遍歷。現在可以通過比較二叉樹的前序遍歷序列和對稱前序遍歷序列來判斷二叉樹是否對稱。如果兩個序

offer試題[59]-對稱

題目描述 請實現一個函式,用來判斷一顆二叉樹是不是對稱的。注意,如果一個二叉樹同此二叉樹的映象是同樣的,定義其為對稱的。 /* struct TreeNode { int val;

leetcode 240. 搜尋維矩陣 II【陣列】【Medium】&&Offer試題4維陣列中的查詢

題目: 編寫一個高效的演算法來搜尋 m x n 矩陣 matrix 中的一個目標值 target。該矩陣具有以下特性: 每行的元素從左到右升序排列。 每列的元素從上到下升序排列。 示例: 現有矩陣 matrix 如下: [

offer 試題50字元流中第一個只出現一次的字元

題目描述:請實現一個函式用來找出字元流中第一個只出現一次的字元。例如,當從字元流中只讀出前兩個字元"go"時,第一個只出現一次的字元是"g"。當從該字元流中讀出前六個字元“google"時,第一個只出現一次的字元是"l"。 解法: 使用雜湊表occurance[256] ;  初始化o

offer 試題19正則表示式匹配

請實現一個函式用來匹配包括'.'和'*'的正則表示式。模式中的字元'.'表示任意一個字元,而'*'表示它前面的字元可以出現任意次(包含0次)。 在本題中,匹配是指字串的所有字元匹配整個模式。例如,字串"aaa"與模式"a.a"和"ab*ac*a"匹配,但是與"aa.a"和"ab*a"均不匹配 c

offer 試題20表示數值的字串

請實現一個函式用來判斷字串是否表示數值(包括整數和小數)。例如,字串"+100","5e2","-123","3.1416"和"-1E-16"都表示數值。 但是"12e","1a3.14","1.2.3","+-5"和"12e+4.3"都不是。 可以用A[.[B]][e|EC]或者.B[e|EC

offer 試題49醜數

 題目:把只包含質因子2、3和5的數稱作醜數(Ugly Number)。例如6、8都是醜數,但14不是,因為它包含質因子7。 習慣上我們把1當做是第一個醜數。求按從小到大的順序的第N個醜數。 思路:用一個數組,三個指標,index2,index3和index5,給每個元素乘以2,3,5

offer 試題57刪除連結串列中的重複節點 c++

本題有兩種 第一題:在一個排序的連結串列中,存在重複的結點,請刪除該連結串列中重複的結點,重複的結點不保留,返回連結串列頭指標。 例如,連結串列1->2->3->3->4->4->5 處理後為 1->2->3->4->5