1. 程式人生 > 其它 >1372 二叉樹中的最長交錯路徑

1372 二叉樹中的最長交錯路徑

技術標籤:LeetCode

題目描述:
給你一棵以 root 為根的二叉樹,二叉樹中的交錯路徑定義如下:
選擇二叉樹中 任意 節點和一個方向(左或者右)。
如果前進方向為右,那麼移動到當前節點的的右子節點,否則移動到它的左子節點。
改變前進方向:左變右或者右變左。
重複第二步和第三步,直到你在樹中無法繼續移動。
交錯路徑的長度定義為:訪問過的節點數目 - 1(單個節點的路徑長度為 0 )。
請你返回給定樹中最長 交錯路徑 的長度。

示例 1:
在這裡插入圖片描述
輸入:root = [1,null,1,1,1,null,null,1,1,null,1,null,null,null,1,null,1]
輸出:3

解釋:藍色節點為樹中最長交錯路徑(右 -> 左 -> 右)。

示例 2:
在這裡插入圖片描述
輸入:root = [1,1,1,null,1,null,null,1,1,null,1]
輸出:4
解釋:藍色節點為樹中最長交錯路徑(左 -> 右 -> 左 -> 右)。

示例 3:
輸入:root = [1]
輸出:0

提示:
每棵樹最多有 50000 個節點。
每個節點的值在 [1, 100] 之間。

方法1:
主要思路:解題彙總連結
(1)後序遍歷;
(2)對於每個結點,標識當前結點是左結點還是右結點;
(3)若當前結點是右結點,則需要使用一個變數儲存該節點的右子樹下的深度,同時返回當前結點的左子樹的深度加1作為父節點的深度;

(4)對於當前結點是左結點,類似;
(5)則對於根節點,在確定左子樹或右子樹下的最大深度之後,再和之前遍歷過程中儲存的所有子節點中可能的最大深度比較,返回最大深度;

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public
: //變數 is_right 標識當前結點是左結點還是右結點,res儲存遍歷過程中,可能出現的最大深度 int find_depth(TreeNode*root,bool is_right,int&res){ if(root==NULL){ return 0; } //找出左右子樹的交叉深度 int right_depth=find_depth(root->right,true,res); int left_depth=find_depth(root->left,false,res); if(is_right){//若當前結點是右結點 res=max(res,right_depth);//儲存當前結點的右子樹的最大交叉深度 return left_depth+1;//返回父節點的交叉深度,既需要和當前結點的左子樹配合 } else{ res=max(res,left_depth); return right_depth+1; } } int longestZigZag(TreeNode* root) { if(root==NULL||(root->left==NULL&&root->right==NULL)){//處理特殊的情形 return 0; } int res=0;//儲存子樹中的最大深度 //左右子樹的交叉深度 int left_depth=find_depth(root->left,false,res); int right_depth=find_depth(root->right,true,res); return max(res,max(left_depth,right_depth));//返回最大值 } };