1. 程式人生 > >劍指offer 39---求二叉樹的深度 && 輸入一顆二叉樹的根節點,判斷該樹是不是平衡二叉樹

劍指offer 39---求二叉樹的深度 && 輸入一顆二叉樹的根節點,判斷該樹是不是平衡二叉樹

求二叉樹的深度

思路:

分別遞迴左右子樹,深度=左右子樹中大的一個+1

/*
struct TreeNode {
	int val;
	struct TreeNode *left;
	struct TreeNode *right;
	TreeNode(int x) :
			val(x), left(NULL), right(NULL) {
	}
};*/
class Solution {
public:
    int TreeDepth(TreeNode* pRoot)
    {
        if(pRoot==NULL)
            {
            return 0;
        }
        int leftDepth=TreeDepth(pRoot->left);
        int rightDepth=TreeDepth(pRoot->right);
        return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
    }
};

輸入一顆二叉樹的根節點,判斷該樹是不是平衡二叉樹

思路:

遞迴每一層都分別算出左右子樹的高度,比較,看是否平衡

class Solution {
public:
    bool IsBalanced_Solution(TreeNode* pRoot) {
        //判斷平衡,比較高度
        if(pRoot==NULL)
            {
            return true;   //空樹是平衡的二叉樹
        }
        int leftDep=TreeDepth(pRoot->left);
        int rightDep=TreeDepth(pRoot->right);
        int dif=leftDep-rightDep;
        if(dif>1||dif<-1)
            {
            return false;
        }
        return IsBalanced_Solution(pRoot->left)&&IsBalanced_Solution(pRoot->right);
    }
    
    int TreeDepth(TreeNode* pRoot)
        {
        if(pRoot==NULL)
            {
            return 0;
        }
        int leftDepth=TreeDepth(pRoot->left);
        int rightDepth=TreeDepth(pRoot->right);
        return leftDepth>rightDepth?leftDepth+1:rightDepth+1;
    }
};

相關推薦

offer 39---深度 && 輸入的根節點判斷平衡

求二叉樹的深度 思路: 分別遞迴左右子樹,深度=左右子樹中大的一個+1 /* struct TreeNode { int val; struct TreeNode *left; struct

offer-39平衡

題目描述 輸入一棵二叉樹,判斷該二叉樹是否是平衡二叉樹。 思路 首先,什麼是平衡二叉樹?如果二叉樹中任意結點的左右子樹深度相差不超過1,那麼它就是平衡二叉樹。 最直接的做法,遍歷每個結點,藉助一個獲取樹深度的遞迴函式,根據該結點的左右子樹高度差判斷是否平衡,然後遞迴地對左右子樹進

offer深度(非遞迴的層次遍歷)Java實現

劍指offer上一道比較基礎的題目,但這個解法不僅可以求二叉樹的深度同時可以求二叉樹的最大層數,某一層的某一個節點 是一種比較通用的方法! 先建立資料模型 package Binary_tree; public class Node {//二叉樹節點 priva

offer-10.個數中進制格式中1的個數

clas 分析 又是 題目 補碼 off number 替換 一個數 0 題目 輸入一個整數,輸出該數二進制表示中1的個數。其中負數用補碼表示。 1 分析 一個數除2,余數為1,那麽表示二進制中含有一個1。 因此可以使用循環,依次判斷。 但是除法效率底,這裏又是除2,因此可

offer》------1+2+3+···+n

public static case ID ret n-1 關鍵字 ase [] 題目: 求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 1.采用&&解答: /*

【Java】 offer(39) 陣列中出現次數超過一半的數字 《Offer》Java實現合集 《Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目    陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1, 2, 3, 2, 2, 2, 5, 4, 2}。由於數字2在陣列中出現

【Java】 offer(39) 數組中出現次數超過一半的數字

特殊 時間復雜度 方法 term 測試 logs pan vat cnblogs 本文參考自《劍指offer》一書,代碼采用Java語言。 更多:《劍指Offer》Java實現合集 題目    數組中有一個數字出現的次數超過數組長度的一半,請找出這個數字。例如輸入

【Java】 offer(40) 最小的k個數 《Offer》Java實現合集 offer(39) 陣列中出現次數超過一半的數字 《Offer》Java實現合集

本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目    輸入n個整數,找出其中最小的k個數。例如輸入4、5、1、6、2、7、3、8這8個數字,則最小的4個數字是1、2、3、4。 思路   思路一:同劍指offer(39

【Java】 offer(64) 1+2+…+n 《Offer》Java實現合集 《Offer》Java實現合集

  本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目   求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 思路   

offer 47. 1+2+3+...+n

原題 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 Reference Answer 思路分析 思路很清奇,採用遞迴思路即可。 # -*- coding:utf-8 -*- cl

Offer-39 陣列中出現次數超過一半的數字

題目: 陣列中有一個數字出現的次數超過陣列長度的一半,請找出這個數字。例如輸入一個長度為9的陣列{1,2,3,2,2,2,5,4,2}。由於數字2在陣列中出現了5次,超過陣列長度的一半,因此輸出2。如果不存在則輸出0。 解答: # -*- coding:utf-8 -*- cl

offer組資料中最小的K個數

題目:輸入n個整數,找出其中最小的K個數。例如輸入4,5,1,6,2,7,3,8這8個數字,則最小的4個數字是1,2,3,4,。   *知識點:Java PriorityQueue 調整新插入元素 轉自 https://www.cnblogs.com/CarpenterLee/p/5488070

offer1+2+3+……+n

題目描述 求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 public class Solution { public int Sum_Solution(int n) {

offer第32題JS演算法:輸入一個整數n從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12從1到12這些整數中包含1的數字有11011和121一共出現了5次

題目:輸入一個整數n,求從1到n這n個整數的十進位制表示中1出現的次數。例如輸入12,從1到12這些整數中包含1的數字有1,10,11和12,1一共出現了5次 這是我某一次去朋友公司面試試水時出的面試題,結果給我五分鐘我寫了個for迴圈的方法,被狠狠鄙視/哭笑不得 結果回來後好奇就跟同事

offer---471+2+3+...+n要求能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)

求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)。 public class Solution { public int Sum_Solution(int n) { // if(

offer1+2+3+...+n

【 宣告:版權所有,轉載請標明出處,請勿用於商業用途。  聯絡信箱:[email protected]】 題目描述求1+2+3+...+n,要求不能使用乘除法、for、while、i

offer系列(十三)把陣列排成最小的數,醜數把陣列排成最小的數

把陣列排成最小的數 題目描述 輸入一個正整數陣列,把數組裡所有數字拼接起來排成一個數,列印能拼接出的所有數字中最小的一個。例如輸入陣列{3,32,321},則打印出這三個數字能排成的最小數字為321323。 解題思路: 把數字轉換為字串,然後cmp比較大小,升序排列後輸出。 cm

【Java】 offer(56-2) 陣列中唯一隻出現次的數字 《Offer》Java實現合集 56-1) 陣列中只出現次的兩個數字 《Offer》Java實現合集

  本文參考自《劍指offer》一書,程式碼採用Java語言。 更多:《劍指Offer》Java實現合集   題目   在一個數組中除了一個數字只出現一次之外,其他數字都出現了三次。請找出那個只出現一次的數字。 思路   這道題中數字出現了三次,無法像56-1) 陣列

offer——(15)第一個只出現次的字元 && 陣列中重複的數字 && 字元流中第一個重複的字元

public class Solution { public int FirstNotRepeatingChar(String str) { if(str.length()<=0) return -1; char c[] = str.toC