得到二叉树每一层最右边一个节点值,存到一个数组中得到结果,并给出测试样例、时间复杂度和空间复杂度。
二叉树总节点数: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;
}