LeetCode 199. Binary Tree Right Side View

来源:互联网 发布:淘宝号怎么注销手机号 编辑:程序博客网 时间:2024/05/21 05:19

          题目:给定一棵二叉树,每个节点的信息包括左右节点的指针,以及其本身的值。让你给出二叉树的“右视图”, 即从上至下给出每一层最右边的节点。

          这题可以用宽度优先搜索的方法来做,具体实现用队列,因为每一层右边的节点有这样的性质:如果对于每个节点,都是左子节点较右子节点先入队,那每一层最右边的节点总是该层最后一个出队的。具体维护用一个向量来实现即可。

          然而这道题一开始就设定好了结构体,但有个问题是,结构体中没有给出该节点所在的层数,所以不能直接拿来遍历,因为遍历到某个节点的时候,你不知道该节点是那一层的,不知道该更新“右视图”的哪一个元素。

          而我的做法是再创建一个结构体,成员变量为TreeNode的指针,与该节点所在的层数。以此来构建BFS队列,具体实现如下。设节点数为n,由于每个节点只要遍历一次,所以时间复杂度为O(n)。

/** * Definition for a binary tree node. * struct TreeNode { *     int val; *     TreeNode *left; *     TreeNode *right; *     TreeNode(int x) : val(x), left(NULL), right(NULL) {} * }; */ struct U {TreeNode *tn ;int level ;U() : level(0), tn(NULL) {}  U(int l, TreeNode *n) : level(l), tn(n) {} }; class Solution {public:    vector<int> rightSideView(TreeNode* root) {        vector<int> ans ;                queue<U> q ;        q.push(U(0, root)) ;                while (!q.empty()) {        U u = q.front() ; q.pop() ;        int l = u.level ;        if ((u.tn) == NULL) continue ;                int v = (u.tn)->val ;        if (l >= ans.size()) ans.push_back(0) ;        ans[l] = v ;                q.push(U(l + 1, (u.tn)->left )) ;        q.push(U(l + 1, (u.tn)->right)) ;                 }                return ans ;            }};


0 0
原创粉丝点击