Java 二叉树遍历右视图-LeetCode199

题目如下:

 题目给出的例子不太好,容易让人误解成不断顺着右节点访问就好了,但是题目意思并不是这样。

换成通俗的意思:按层遍历二叉树,输出每层的最右端结点。

这就明白时一道二叉树层序遍历的问题,用一个队列来处理,但是问题是怎么来辨别每层的最右端结点,我思考了半天,最后想出的办法是利用一个标记位,例如上面的例子:

q代表队列,f代表标记结点,right代表记录的最右端结点

q: 1 flag    right:{}

q: flag 2 3   遇到标记位所以移动标记位,并将队头弹出的数据存起来如下

q: 2 3 flag   right:{1}

q: 3 flag 5   right:{1}

q: flag 5 4   遇到标记位所以移动标记位,并将队头弹出的数据存起来如下

q: 5 4 flag   right:{1 3}

q: 4 flag    right:{1 3}

q: flag     遇到标记位所以移动标记位,并将队头弹出的数据存起来如下

q: flag     right:{1 3 4}

此时发现队列元素只剩1,退出循环返回结果

代码如下:

    public class TreeNode {
        int val;
        TreeNode left;
        TreeNode right;

        TreeNode(int x) {
            val = x;
        }
    }

    public List<Integer> rightSideView(TreeNode root) {
        List<Integer> right = new ArrayList<Integer>();
        if (root == null)
            return right;
        Queue<TreeNode> q = new LinkedList<TreeNode>();
        TreeNode p = root;
        TreeNode flag = new TreeNode(-99999999);
        q.add(p);
        q.add(flag);
        while (q.size() != 1) {
            p = q.poll();
            if (p.left != null)
                q.add(p.left);
            if (p.right != null)
                q.add(p.right);
            if (q.peek().val == -99999999) {
                right.add(p.val);
                q.poll();
                q.add(flag);
            }
        }

        return right;
    }

 

这里我标记位开始用了-1,后来郁闷的发现测试集中结点元素有-1,就改为了现在这个,通过了。

另外网上翻阅了下别人的解法,有先将一层的代码全部访问完,再去访问下一层的元素,以此来找到每层最右端结点,代码如下:

 1 /**
 2  * Definition for binary tree
 3  * struct TreeNode {
 4  *     int val;
 5  *     TreeNode *left;
 6  *     TreeNode *right;
 7  *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 8  * };
 9  */
10 class Solution {
11 public:
12     vector<int> rightSideView(TreeNode *root) {
13         vector<int> res;
14         if (!root) return res;
15         queue<TreeNode*> q;
16         q.push(root);
17         while (!q.empty()) {
18             res.push_back(q.back()->val);
19             int size = q.size();
20             for (int i = 0; i < size; ++i) {
21                 TreeNode *node = q.front();
22                 q.pop();
23                 if (node->left) q.push(node->left);
24                 if (node->right) q.push(node->right);
25             }
26         }
27         return res;
28     }
29 };

C++写的,两种思路都可以的

 

posted @ 2015-04-26 23:24  xlturing  阅读(1065)  评论(0编辑  收藏  举报