鱼C论坛

 找回密码
 立即注册
查看: 1368|回复: 0

[技术交流] C++刷leetcode(199. 二叉树的右视图)【递归】

[复制链接]
发表于 2020-4-9 11:00:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 糖逗 于 2020-5-8 17:36 编辑

题目描述:
  1. 给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。

  2. 示例:

  3. 输入: [1,2,3,null,5,null,4]
  4. 输出: [1, 3, 4]
  5. 解释:

  6.    1            <---
  7. /   \
  8. 2     3         <---
  9. \     \
  10.   5     4       <---

  11. 来源:力扣(LeetCode)
  12. 链接:https://leetcode-cn.com/problems/binary-tree-right-side-view
  13. 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
复制代码


  1. #include<iostream>
  2. #include <malloc.h>
  3. #include <vector>
  4. #include <math.h>
  5. #include <queue>
  6. #include<vector>
  7. using namespace std;

  8. struct TreeNode{
  9.         int val;
  10.         TreeNode* left;
  11.         TreeNode* right;
  12.         TreeNode(int x): val(x), left(NULL), right(NULL){
  13.         }
  14. };

  15. TreeNode* CreateTree(vector<int> input){
  16.     TreeNode* res = (TreeNode*)malloc(sizeof(TreeNode)*input.size());
  17.     for(int i = 0; i < input.size(); i++){
  18.             res[i].val = input[i];
  19.             res[i].left = NULL;
  20.             res[i].right = NULL;
  21.     }
  22.     for(int i= 0; i < input.size(); i++){
  23.             if(2*i+1 < input.size()){
  24.                     res[i].left = &res[2*i+1];
  25.             }
  26.             if(2*i+2 < input.size()){
  27.                     res[i].right = &res[2*i+2];
  28.             }
  29.            
  30.     }
  31.     return res;
  32.         
  33. }

  34. void middle(TreeNode* root, vector<vector<int> >& res, int left, int right, int depth){
  35.     if(root == NULL) return;
  36.     int insert = left + (right - left) / 2;
  37.     res[depth][insert] = root->val;
  38.            
  39.     middle(root->left, res, left, insert - 1, depth + 1);
  40.     middle(root->right, res, insert + 1, right, depth + 1);
  41.     }

  42. int treeDepth(TreeNode* root){
  43.     if(root == NULL || root -> val == 0) return 0;
  44.     return max(treeDepth(root->left) + 1, treeDepth(root->right) + 1);
  45. }
  46.       
  47. void PrintTree(TreeNode* root) {
  48.     int depth = treeDepth(root);
  49.     int width = pow(2, depth) - 1;
  50.     vector<vector<int> > res(depth, vector<int>(width, 0));
  51.     middle(root, res, 0, width - 1, 0);
  52.     for(int i = 0; i < res.size(); i++){
  53.         for(int j = 0; j < res[i].size();j++){
  54.             if(res[i][j] == 0){
  55.                     cout  << " ";
  56.             }
  57.             else{
  58.                     cout << res[i][j];
  59.             }
  60.            
  61.         }
  62.         cout << endl;
  63.     }
  64.     cout << "------------------" << endl;
  65. }


  66. int depth = 0;
  67. vector<int> res;
  68. void dfs(TreeNode* root, int dep){
  69.         if(root == NULL) return;
  70.         if(dep == depth){
  71.                 res.push_back(root -> val);
  72.                 depth++;
  73.         }
  74.         dfs(root -> right,  dep+1);
  75.         dfs(root -> left, dep+1);
  76. }


  77. vector<int> solution(TreeNode* root){
  78.         dfs(root, 0);
  79.     return res;
  80. }


  81. int main(void){
  82.     vector<int> input1;
  83.     cout << "send numbers for the  tree" << endl;
  84.     int number1;
  85.     while(cin >> number1){
  86.             input1.push_back(number1);
  87.     }
  88.     cin.clear();
  89.     TreeNode* root = CreateTree(input1);
  90.     PrintTree(root);
  91.    
  92.    solution(root);
  93.    for(int i = 0; i < res.size(); i++){
  94.            cout << res[i] << " ";
  95.    }
  96.    cout << endl;
  97.    
  98.     return 0;
  99. }
复制代码




注意事项:
1.暂无。

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-29 10:24

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表