1. 程式人生 > >二叉樹的最大深度和最小深度實現

二叉樹的最大深度和最小深度實現

二叉樹的最大深度

給定一個二叉樹,找出其最大深度。
二叉樹的深度為根節點到最遠葉子節點的距離。
如果二叉樹為空,則深度為0
如果不為空,分別求左子樹的深度和右子樹的深度,取最大的再加1.

二叉樹的最小深度

給定一個二叉樹,找出其最小深度。
二叉樹的最小深度為根節點到最近葉子節點的距離。
判斷左子樹或右子樹是否為空,若左子樹為空,則返回右子樹的深度,反之返回左子樹的深度,如果都不為空,則返回左子樹和右子樹深度的最小值。

程式碼實現:

#include <iostream>
#include <vector>
#include <list>
using namespace std; class TreeNode{ public: int val; TreeNode *left, *right; TreeNode(int m_val):val(m_val), left(NULL), right(NULL){ } TreeNode* createTree(vector<int> list, int start); }; TreeNode* TreeNode::createTree(vector<int> list, int
start){ if(list[start] == '#') { return NULL; } TreeNode *root = new TreeNode(list[start]); int lnode = 2*start + 1; int rnode = 2*start + 2; if(lnode > list.size() - 1) { root->left = NULL; } else
{ root->left = createTree(list, lnode); } if(rnode > list.size()- 1) { root->right = NULL; } else { root->right = createTree(list, rnode); } return root; } class Solution{ public: int MinDepth(TreeNode *root){ if(root == NULL){ return 0; } if(root->left == NULL){ return MinDepth(root->right) + 1; } if(root->right == NULL){ return MinDepth(root->left) + 1; } int leftDepth = MinDepth(root->left) + 1; int rightDepth = MinDepth(root->right) + 1; return leftDepth < rightDepth ? leftDepth : rightDepth; } int MaxDepth(TreeNode *root){ if(root == NULL){ return 0; } int leftDepth = MaxDepth(root->left) + 1; int rightDepth = MaxDepth(root->right) + 1; return leftDepth > rightDepth ? leftDepth : rightDepth; } }; int main() { Solution s; vector<int> datanum; datanum.push_back(1); datanum.push_back(2); datanum.push_back(3); datanum.push_back(4); datanum.push_back(5); datanum.push_back('#'); datanum.push_back(6); datanum.push_back('#'); datanum.push_back('#'); datanum.push_back(7); datanum.push_back(8); TreeNode *tree, *root; root = tree->createTree(datanum, 0); cout << s.MinDepth(root) << endl; cout << s.MaxDepth(root) << endl; system("pause"); return 0; }

相關推薦

找出搜尋節點節點

problem:Write recursive versions of TREE-MINIMUM and TREE-MAXIMUM. typedef struct BiTNode {     int data;     struc

leetcode104 給定一個,找出其深度

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 示例: 給定二叉樹 [3,9,20,null,null,15,7], 3 / \ 9 20 / \

Binary Tree Maximum Path Sum 中任意路徑的

Given a binary tree, find the maximum path sum. For this problem, a path is defined as any sequence of nodes from some starting node to any node in the tr

阿里14筆試題-求一個值的差值絕對值

阿里巴巴面試題: 輸入:一個二叉樹 輸出:二叉樹的最大值和最小值的差值絕對值 單純從演算法功能上來看 1-可以先建立一個大根堆,把最大的元素挑出來; 2-然後在建立小根堆,把最小的元素挑出來; 3-在求最大和最小差值的絕對值; 程式碼: #if 0 /* 最大堆排序 */

LeetCode104 給定一個,找出其深度深度為根節點到遠葉子節點的長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。

給定一個二叉樹,找出其最大深度。 二叉樹的深度為根節點到最遠葉子節點的最長路徑上的節點數。 說明: 葉子節點是指沒有子節點的節點。 /** * Definition for a binary tree node. * struct TreeNode

js 刪除

ret 判斷 lse size pla ren 二叉樹 splay 利用 //刪除最小值function delMinNode (root){ if(!root) { return false; } var current = root;

3.6 在中找到累加為指定值的長路徑長度

【題目】:   給定一棵二叉樹的頭節點head和一個32位整數sum,二叉樹節點值型別為整型,求累加和為sum的最長路徑長度。路徑是指從某個節點往下,每次最多選擇一個孩子節點或者不選所形成的的節點鏈   例如, 二叉樹如圖所示               -3           3   &

的廣度優先遍歷、深度優先遍歷的遞歸非遞歸實現方式

root 中序遍歷 queue push stack pop pac imp current 二叉樹的遍歷方式: 1、深度優先:遞歸,非遞歸實現方式   1)先序遍歷:先訪問根節點,再依次訪問左子樹和右子樹   2)中序遍歷:先訪問左子樹,再訪問根節點嗎,最後訪問右子樹

)數組的

turn i++ pre arr sha println out get new class Demo4 { public static void main(String[] args) { int[] a = new int[]{12,1

輸出每一層的右邊節點

輸入: [1,2,3,null,5,null,4] 輸出: [1, 3, 4] 解釋: 1 <--- / \ 2 3 <--- \ \ 5 4 <--- leetc

的遍歷深度

二叉樹作為最常碰到和最基礎的資料結構,今天來聊一聊它  二叉樹的遍歷分為深度優先遍歷和廣度優先遍歷,其中,深度優先遍歷又分為先序遍歷,中序遍歷和後序遍歷三種。 先,中,後都是根據根節點而言的 ,即: 先序遍歷:根——左——右 中序遍歷:左——根——右 後序遍歷:

【演算法導論】求的葉子數深度

/**********************************************\ 函式功能:計算葉子節點個數 輸入: 二叉樹的根節點 輸出: 葉子節點個數 \**********************************************/ int countleaf(

java如何求維陣列的值。

public class SecondArray { public static void main(String[] args) { //int a[][]= new int[][]{{1

中兩個節點遠的距離

一說到二叉樹,就有很多題目,今天在程式設計之美中看到了二叉樹中兩個節點最遠的距離。所以給想借機寫一篇部落格。 在開始之前,我們先想想,兩個最常節點的最遠距離是怎麼樣的? 情況一:最大距離可能一個在左子

數據結構與算法第10周作業——的創建遍歷算法

技術分享 truct order traverse eof 結構 後序遍歷 lib void 一、二叉樹的創建算法(遞歸方式) 二、二叉樹的先序、中序和後序遍歷算法 #include<stdio.h>#include<stdlib.h>typedef

數據結構-第10周作業(的創建遍歷算法)

樹的創建 創建 -1 數據結構 二叉 分享 com jpg 遍歷算法 數據結構-第10周作業(二叉樹的創建和遍歷算法)

編寫C#程序,計算去除值之後的平均值

pub ole eric efault lis ner .get ast c# 有10位評委對跳水運動員做評分,編寫C#程序,計算去除最大得分和最小得分之後的平均得分 作為運動員的跳水成績。 interface IMark using System.Collections

從輸入的值中獲取值,輸入0後結束(利用do_while boolean isRight來標識用戶輸入)

bool out 用戶 system efault 最大 pub string void mport java.util.Scanner; public class DoWhile2 {public static void main(String[] args) { int

給出的先序中序遍歷,給出後序遍歷

logs __main__ font class pre span 思想 style 輸出 實現一個功能: 輸入:一顆二叉樹的先序和中序遍歷 輸出:後續遍歷思想: 先序遍歷中,第一個元素是樹根 在中序遍歷中找到樹根,左邊的是左子樹 右邊的是右子樹

的序列化反序列化

nbsp node 使用遞歸 輸入 特殊字符 this tail 改變 代碼實現 http://blog.csdn.net/qq_27703417/article/details/70958692 先序遍歷二叉樹,如果遇到空節點,就在str的末尾加上“#!”,“#”表示