1. 程式人生 > >leetcode 662二叉樹最大寬度

leetcode 662二叉樹最大寬度

一開始的思路是用bfs,但是感覺處理起來比較麻煩,後續會更新bfs的方法,這裡先貼上dfs的方法。

/**  * Definition for a binary tree node.  * struct TreeNode {  *     int val;  *     TreeNode *left;  *     TreeNode *right;  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}  * };  */ //大佬的做法是dfs,並判斷當前遍歷的節點是該層的第幾個節點 //我們只需要找到每一層最左邊和最右邊的節點的索引即可,然後相減即為該層的節點個數即寬度 //有一個trick,即為了防止在求下一層索引時,因為層數太深而導致索引值過大而爆掉 //我們可以在下一層索引*2前,先減去上一層的最小值---可以這樣做的原因是 //二叉樹中下一層節點的索引,一定>=上一層節點,因為畢竟要*2嘛 class Solution { public:     //分別用於儲存每一層的最小索引和最大索引     vector<int> mini,maxi;     void dfs(TreeNode* root,int height,int index)     {         //返回這一步很重要         if(root==NULL) return;         if(mini.size()==height)         {             mini.push_back(1<<31-1);             maxi.push_back(1<<31);         }                  //注意同一層的mini和maxi是動態更新的         mini[height]=min(mini[height],index);         maxi[height]=max(maxi[height],index);                  dfs(root->left,height+1,(index-mini[height])*2);         dfs(root->right,height+1,(index-mini[height])*2+1);              }     int widthOfBinaryTree(TreeNode* root) {         if(root==NULL) return 0;         //人為定義根節點深度為0,且每層的索引值從0開始         dfs(root,0,0);         int ret=0;         for(int i=0;i<mini.size();i++)         {             ret=max(maxi[i]-mini[i]+1,ret);         }         return ret;     } };