1372 二叉樹中的最長交錯路徑
阿新 • • 發佈:2021-02-01
技術標籤: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作為父節點的深度;
(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));//返回最大值
}
};