1. 程式人生 > >lintcode 632. 二叉樹的最大節點

lintcode 632. 二叉樹的最大節點

描述:

在二叉樹中尋找值最大的節點並返回。

您在真實的面試中是否遇到過這個題?

樣例

給出如下一棵二叉樹:

     1
   /   \
 -5     2
 / \   /  \
0   3 -4  -5 

返回值為 3 的節點。

思路:肯定遞迴啦QAQ,但是注意不要踩訪問空指標的坑,比如一開始我就踩了幾個

先上程式碼(先乾為敬)

/* version 1.0*/
class Solution {
public:
	/*
	* @param root: the root of tree
	* @return: the max node
	*/
	TreeNode * maxNode(TreeNode * root) {
		// write your code here
		if (nullptr == root)
		{
			return nullptr;
		}
		else
		{
			TreeNode *left, *right;
			left = maxNode(root->left);
			left = nullptr == left ? root : left;

			right = maxNode(root->right);
			right = nullptr == right ? root : right;

			int i_left = nullptr == left ? INT_MIN : left->val;
			int i_right = nullptr == right ? INT_MIN : right->val;

			TreeNode *childMax = i_left > i_right ? left : right;

			return root->val > childMax->val ? root : childMax;
		}
	}
};

覺得太醜了,遂優之

/* version 2.0*/
class Solution {
public:
	/*
	* @param root: the root of tree
	* @return: the max node
	*/
	TreeNode * maxNode(TreeNode * root) {
		// write your code here
		if (nullptr == root)
		{
			return nullptr;
		}
		else
		{
			TreeNode *left, *right;
			left = right = root;

			if (nullptr != root->left)
				left = maxNode(root->left);

			if (nullptr != root->right)
				right = maxNode(root->right);


			TreeNode *childMax = left->val > right->val ? left : right;
			return root->val > childMax->val ? root : childMax;
		}
	}
};

這就好看多了

我踩的坑在於:最小子結構是一顆小樹,這個樹要返回三個節點中包含數值最大的那個。按照這個思路遞迴,如果這個樹的左子樹,或右子樹為空,就不遞迴查詢左右子樹。同時,由於後面的比較要訪問左右子樹,所以一開始左右子樹賦初值就是根節點,一波操作,完美避坑(想試坑的話可以讓 left = right = nullptr)

VS下測試用程式碼:
/*節點*/
struct TreeNode
{
	TreeNode *left;
	TreeNode *right;
	int val;

	TreeNode(int _val = 0):left(nullptr), right(nullptr), val(_val){}
};



int main(void)
{
	TreeNode *node_1 = new TreeNode(1);
	TreeNode *node__5 = new TreeNode(-5);
	TreeNode *node_2 = new TreeNode(2);
	TreeNode *node_0 = new TreeNode(0);
	TreeNode *node_3 = new TreeNode(3);
	TreeNode *node__4 = new TreeNode(-4);
	TreeNode *node__6 = new TreeNode(-6);

	node_1->left = node__5;
	node_1->right = node_2;

	node__5->left = node_0;
	node__5->right = node_3;
	
	node_2->left = node__4;
	node_2->right = node__6;

	Solution solution;

	std::cout << "The result = " << solution.maxNode(node_1)->val << std::endl;

	system("PAUSE");
	return 0;
}

相關推薦

lintcode 632. 節點

描述: 在二叉樹中尋找值最大的節點並返回。 您在真實的面試中是否遇到過這個題? 樣例 給出如下一棵二叉樹: 1 / \ -5 2 / \ / \ 0

【入門】lintcode 632: 節點

在二叉樹中尋找值最大的節點並返回。 樣例 給出如下一棵二叉樹: 1 / \ -5 2 / \ / \ 0 3 -4 -5 返回值為 3 的節點。

lintcode(632)節點

描述: 在二叉樹中尋找值最大的節點並返回。 樣例; 給出如下一棵二叉樹: 1 / \ -5 2 / \ / \ 0 3 -4 -5 返回值為 3 的節點。 思路: 遞迴,並且用陣列物件儲存當前結果 public clas

葉子節點距離(不含全域性變數)

題目: 輸入一顆二叉樹先序遍歷的字串,輸出該二叉樹的最大葉子節點距離 分析知,最大的距離要麼是經過根節點的一條路徑,要麼是在左子樹中的一條路徑,或者是在右子樹中的一條路徑。 那麼可以知道最大葉子節點的距離是左右子樹的高度和、左子樹最大葉節點距離、右子樹最大葉節點距

查詢節點

如題 : 在二叉樹中查詢最大值的節點並返回 測試資料 : {1,-5,3,1,2,-4,-5} 答案 : 3 思路 : 從根節點往下分別查詢左子樹和右子樹的最大節點,再比較左子樹,右子樹,根節點的大小

CODEVS 1501寬度和高度

它的 logs nbsp 二叉 ace 最小寬度 最大 -h blog 題目描述 Description 給出一個二叉樹,輸出它的最大寬度和高度。 輸入描述 Input Description 第一行一個整數n。 下面n行每行有兩個數,對於第i行的兩個數

小深度

als 最小 log root roo null mat dep tde 1.求二叉樹最大深度 public int maxDepth(TreeNode root) { if(root==null){ return 0;

18.2.14 codevs1501 寬度和高度

isp 連接 左右 ron esp color 整數 end codevs 題目描述 Description 給出一個二叉樹,輸出它的最大寬度和高度。 輸入描述 Input Description 第一行一個整數n。 下面n行每行有兩

深度和小深度

str treenode oot null 避免 結果 一個 blog clas 最大深度: int maxDepth(TreeNode *root) { if(root == NULL) return 0;

2018.3.26 1501 寬度和高度

一個空格 post 12px 一行 個數 padding pac ide urn 題目描述 給出一個二叉樹,輸出它的最大寬度和高度。 輸入描述 第一行一個整數n。下面n行每行有兩個數,對於第i行的兩個數,代表編號為i的節點所連接的兩個左右兒子的編號。如果沒有某個兒子

LeetCode之深度(簡單

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

LeetCode662 寬度

給定一個二叉樹,編寫一個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹(full binary tree)結構相同,但一些節點為空。 每一層的寬度被定義為兩個端點(該層最左和最右的非空節點,兩端點間的null節點也計入長度)之間的長度。 示例 1: 輸入:

深度(遞迴實現python)---LeetCode

# Definition for a binary tree node. # class TreeNode: # def __init__(self, x): # self.val = x # self.left = None #

leetcode662. 寬度

題目連結: https://leetcode-cn.com/problems/maximum-width-of-binary-tree/ 題目: 給定一個二叉樹,編寫一個函式來獲取這個樹的最大寬度。樹的寬度是所有層中的最大寬度。這個二叉樹與滿二叉樹(full binary tree)結構

leetcode 662寬度

一開始的思路是用bfs,但是感覺處理起來比較麻煩,後續會更新bfs的方法,這裡先貼上dfs的方法。 /**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     T

【多次過】Lintcode 595. 長連續序列

給一棵二叉樹,找到最長連續路徑的長度。 這條路徑是指 任何的節點序列中的起始節點到樹中的任一節點都必須遵循 父-子 聯絡。最長的連續路徑必須是從父親節點到孩子節點(不能逆序)。 樣例 舉個例子: 1 \ 3 / \ 2 4 \

LeetCode124 路徑總和

Given a non-empty binary tree, find the maximum path sum. For this problem, a path is defined as any sequence of nodes from some starting node t

LeetCode 124. 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

路徑和

給出一個二叉樹,找到其中的最大路徑和。 路徑可以從樹中任意一個節點開始和結束。 例如: 給出如下二叉樹,        1       / \     2    3 返回6。 初始思路 為了簡化分析,我們先假設二叉樹中所有節點的值都是正數。通過觀察可以

深度(Java)

題目:輸入一棵二叉樹的根節點,求該樹的深度。從根節點到葉子結點一次經過的結點形成樹的一條路徑,最長路徑的長度為樹的深度。根節點的深度為1。 解體思路: 如果根節點為空,則深度為0,返回0,遞迴的出口 如果根節點不為空,那麼深度至少為1,然後我們求他們左右子樹的深度, 比較左