力扣Leetcode 199. 二叉树的右视图

199. 二叉树的右视图

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

示例:

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

   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

🔒 思路 & 题解

利用层次遍历 队列特性 每层遍历到最后的元素就是右视图所需的 以下两代码都通过 写法类似

代码一

vector<int> rightSideView(TreeNode* root) {
    if (root == nullptr) return res; // 空树判断
    vector<int> ans; // 定义结果vector
    queue<TreeNode*> que; // 定义遍历队列 que
    que.push(root); // 树根节点入队

    while (!que.empty()) { // 层次遍历
        int len = que.size(); // 每层的节点数
        for (int i = 0; i < len; i++) { 
            auto q = que.front(); // 获取队头元素为 q
            que.pop(); // 弹出队
            if (i == len - 1) {  // 若此时遍历到的是队列长度-1 即最后一个元素
                ans.push_back(q->val); // 是我们所需的 加入结果ans
            }
            if (q->left != nullptr) { // 当前节点左子树是否为空
                que.push(q->left);
            }
            if (q->right != nullptr) { // 当前节点右字数是否为空
                que.push(q->right);
            }
        }
    }
    return ans;
}

代码二

vector<int> rightSideView(TreeNode* root) {
	vector<int> res; // 定义结果vector
	if (!root) return res; // 空树判断
	queue<TreeNode*> q; // 定义遍历队列 q
	q.push(root); // 树根节点入队
	while (!q.empty()){
		int size = q.size();
		res.push_back(q.front()->val);
		while (size--) // 与上不同 这里直接是一层的size--遍历
		{
			TreeNode* temp = q.front(); // 队列特性 且下面也是类似后序的右左遍历 所以队头就是所需值
			q.pop(); 
			if (temp->right) q.push(temp->right); // 对弹出进行子树判定 
			if (temp->left) q.push(temp->left);
		}
	}
return res;
posted @ 2020-04-22 16:04  CoderZjz  阅读(154)  评论(0编辑  收藏  举报