4、求二叉樹每一層最右節點值
阿新 • • 發佈:2019-01-24
得到二叉樹每一層最右邊一個節點值,存到一個數組中得到結果,並給出測試樣例、時間複雜度和空間複雜度。
二叉樹總節點數:m,層數:h
思路1: 深搜,時間複雜度O(m), 空間複雜度O(h).
void dfs (TreeNode* root, int level, vector<int> &re) { if(!root) return; if(re.size()==level) re.push_back(root->val); else re[level]=root->val; dfs(root->left, level+1, re); dfs(root->right, level+1, re); } vector<int> levelRight(TreeNode* root) { vector<int>re; dfs(root,0,re); return re; }
思路2:寬搜,時間複雜度O(m), 空間複雜度O(h+n). 其中n為最長的一層的節點數。
BFS方法的空間複雜度主要體現在兩個方面:1、queue所佔的大小,這個最大是O(n)(n為最長的一層的節點數)2、和dfs方法是一樣的,只需要存最右邊節點就行了,佔用空間O(h), h為層數。所以BFS的空間複雜度O(h+n)。
struct TreeNode{ int val; TreeNode *left; TreeNode *right; TreeNode(int x): val(x), left(nullptr), right(nullptr){} }; #include<iostream> #include<vector> #include<queue> using namespace std; #solution bfs vector<int> levelRight(TreeNode * root){ vector<int>ans; if(root==nullptr) return ans; queue<TreeNode *>bfs; bfs.push(root); while(!bfs.empty()){ int n=bfs.size(), aa=0; for(int i=0; i<n; ++i){ TreeNode *temp=bfs.front(); bfs.pop(); aa=temp->val; if(temp->left){ bfs.push(temp->left); } if(temp->right){ bfs.push(temp->right); } } ans.push_back(aa); } return ans; } int main(){ #test1 TreeNode *root=new TreeNode(1); TreeNode *l2=new TreeNode(2); TreeNode *l3=new TreeNode(3); TreeNode *l4=new TreeNode(4); TreeNode *l5=new TreeNode(5); TreeNode *l6=new TreeNode(6); root->left=l2; root->right=l3; l2->left=l4; l3->left=l5; l3->right=l6; #test2 TreeNode *root=nullptr; #test3 TreeNode *root=new TreeNode(1); TreeNode *l2=new TreeNode(2); TreeNode *l3=new TreeNode(3); TreeNode *l5=new TreeNode(5); root->left=l2; root->right=l3; l3->left=l5; #test4 TreeNode *root=new TreeNode(1); TreeNode *l2=new TreeNode(2); TreeNode *l3=new TreeNode(3); TreeNode *l5=new TreeNode(5); root->left=l2; root->right=l3; l2->left=l5; vector<int>re=levelRight(root); for(int x:re){ cout<<x<<" "; } cout<<endl; return 0; }