1. 程式人生 > >劍指offer:判斷二叉樹是不是平衡二叉樹(java)

劍指offer:判斷二叉樹是不是平衡二叉樹(java)

題目:輸入一棵二叉樹的根節點,判斷該樹是不是平衡的二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。

    有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到一個思路:在遍歷樹的每個結點的時候,呼叫函式TreeDepth得到它的左右子樹的深度。如果每個結點的左右子樹的深度相差不超過1,按照定義它就是一棵平衡的二叉樹。這種思路實現的程式碼如下:

 public boolean isBalanced(BinaryTreeNode root){  
        if(root ==null)  
            return true;  
        int left = treeDepth(root.leftNode);  
        int right = treeDepth(root.rightNode);  
        int diff = left - right;  
        if(diff > 1 || diff <-1)  
            return false;  
        return isBalanced(root.leftNode) && isBalanced(root.rightNode);  
    }  
     上面的程式碼固然簡潔,但我們也注意到由於一個結點會被重複遍歷多次,這種思路的時間效率不高。

每個結點只遍歷一次的解法,正是面試官喜歡的演算法
     如果我們用後序遍歷的方式遍歷二叉樹的每個結點,在遍歷一個結點之前我們就已經遍歷了它的左右子樹。只要在遍歷每個結點的時候我們記錄它的深度(某一節點的深度等於它到葉結點的路徑的長度),我們就可以一邊遍歷一邊判斷每個結點是不是平衡二叉樹。下面是這種思路的實現程式碼:

 public boolean isBalanced2(BinaryTreeNode root){  
        int depth = 0;  
        return isBalanced2(root,depth);  
    }  
    public boolean isBalanced2(BinaryTreeNode root,int depth){  
        if(root == null){  
            depth = 0;  
            return true;  
        }  
        int left = 0,right = 0;  
        if(isBalanced2(root.leftNode,left) && isBalanced2(root.rightNode,right)){  
            int diff = left-right;  
            if(diff <= 1 && diff >= -1){  
                depth = 1+(left > right?left : right);  
                return true;  
            }  
        }  
        return false;  
    }  


相關推薦

offer》系列 把陣列排成最小的數Java

連結 牛客:把陣列排成最小的數 題目描述 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 思路 1、全排列 求出陣列中所有數字的全排列

offer》系列 連續子陣列的最大和Java

連結 牛客:連續子陣列的最大和 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是否應該包含某個負數,並期望旁邊

offer》系列 和為S的兩個數字Java

連結 牛客:和為S的兩個數字 題目描述 輸入一個遞增排序的陣列和一個數字S,在陣列中查詢兩個數,使得他們的和正好是S,如果有多對數字的和等於S,輸出兩個數的乘積最小的。 輸出描述: 對應每個測試案例,輸出兩個數,小的先輸出。 思路 初始化兩個指標分別是第一個和

offer》系列 和為S的連續正數序列Java

連結 牛客:和為S的連續正數序列 題目描述 小明很喜歡數學,有一天他在做數學作業時,要求計算出9~16的和,他馬上就寫出了正確答案是100。但是他並不滿足於此,他在想究竟有多少種連續的正數序列的和為100(至少包括兩個數)。沒多久,他就得到另一組連續正數和為100的序列:18

offer》系列 連續子陣列的最大和Java

連結 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如

offer》系列 合併兩個排序的連結串列C++

連結 題目描述 輸入兩個單調遞增的連結串列,輸出兩個連結串列合成後的連結串列,當然我們需要合成後的連結串列滿足單調不減規則。 思路 兩個連結串列依次比較即可 程式碼 class Solution {

Offer學習】【面試題13 :在O1時間刪除連結串列結點】

程式碼實現: public class Test13 { /** * 連結串列結點 */ public static class ListNode { int value; // 儲存連結串列的值 L

offer面試題10:斐波那契數列Java 實現

題目:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項。 思路:使用遞迴會重複計算,效率較低,可以用迴圈自下到上計算。 測試用例: 功能測試:輸入3、5、10 等。 邊界測試:輸入0、1、2 效能測試:輸入較大的數(如40、50、

Offer:面試題7——用兩個棧實現佇列java實現

題目描述:用兩個棧來實現一個佇列,完成佇列的Push和Pop操作。 佇列中的元素為int型別。 首先定義兩個棧 Stack<Integer> stack1 = new Stack<Integer>();//作為進隊的埠 Stack

offer:陣列中只出現一次的數字python

題目描述一個整型數組裡除了兩個數字之外,其他的數字都出現了兩次。請寫程式找出這兩個只出現一次的數字。# -*- coding:utf-8 -*- class Solution: # 返回[a,b] 其中ab是出現一次的兩個數字 def FindNumsAppe

offer:判斷平衡java

題目:輸入一棵二叉樹的根節點,判斷該樹是不是平衡的二叉樹。如果某二叉樹中任意結點的左右子樹的深度相差不超過1,那麼它就是一棵平衡二叉樹。     有了求二叉樹的深度的經驗之後再解決這個問題,我們很容易就能想到一個思路:在遍歷樹的每個結點的時候,呼叫函式TreeDepth得到

offer-判斷是否是平衡

balanced pri oot treenode col solution offer private == private boolean isBalanced = true; public boolean IsBalanced_Solution(T

Offer——判斷平衡

題目描述: 輸入一個二叉樹的根節點, 1)求二叉樹的深度。 2)判斷該樹是不是平衡二叉樹。 二叉樹的深度:從根節點遍歷到葉節點的路徑,經過最長路徑的節點數。 平衡二叉樹:二叉樹的任意結點的左右子樹的深

59、offer--按之字形順序打印

print 題目 一個棧 wrap offer 二叉 原因 treenode 只有一個 題目描述 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。 解題思路:通過分析,使用棧

offer---從上往下打印

cnblogs == oot div from ack () emp off /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right; Tree

offer六十之按之把打印成多行

rac ger pty interview https 技術 記錄 ide clas 一、題目   從上到下按層打印二叉樹,同一層結點從左至右輸出。每一層輸出一行。二、思路 隊列LinkedList完成層序遍歷,用end記錄每層結點數目 三、代碼 impo

Offer——從上往下打印

先進先出 public rom val nod top 二叉 () str 題目描述: 從上往下打印出二叉樹的每個節點,同層節點從左至右打印。 分析: 層次遍歷,利用隊列的性質,先進先出。 先將根結點的指針入隊。 如果隊列不為空,那麽打印隊列第一個指針指向的值,如果左

Offer——按之字形順序打印

打印二叉樹 sta cnblogs 我們 pre 方便 pri == stack 題目描述: 請實現一個函數按照之字形打印二叉樹,即第一行按照從左到右的順序打印,第二層按照從右至左的順序打印,第三行按照從左到右的順序打印,其他行以此類推。 分析: 我們都知道二叉樹的層次遍歷

offer】面試題 28. 對稱的

fin 技術分享 root 實現一個函數 面試題 分享 inf right png 面試題 28. 對稱的二叉樹 題目描述 題目:請實現一個函數,用來判斷一顆二叉樹是不是對稱的。註意,如果一個二叉樹同此二叉樹的鏡像是同樣的,定義其為對稱的。 解答過程 給定一個二叉

offer-從上往下打印

poll roo off 一個棧 val printf pri 題目 模擬 題目:從上往下打印二叉樹 題目描述:從上往下打印出二叉樹的每個節點,同層節點從左至右打印 思路:考察二叉樹的 層序遍歷,通常借助使用一個隊列或一個棧來完成 若是要求每層數據從左到右保存則用隊列