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; } };