4、求二叉树每一层最右节点值

得到二叉树每一层最右边一个节点值,存到一个数组中得到结果,并给出测试样例、时间复杂度和空间复杂度。

二叉树总节点数: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;
}

猜你喜欢

转载自blog.csdn.net/Scarlett_Guan/article/details/82314520
今日推荐