LeetCode 二叉树的右视图(层次遍历)

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

示例:

输入: [1,2,3,null,5,null,4]
输出: [1, 3, 4]
解释:
   1            <---
 /   \
2     3         <---
 \     \
  5     4       <---

思路分析:这个右视图说白了就是层次遍历的尾端节点,所以只要层次遍历二叉树,获得每层的尾端节点即可。
层次遍历:从树的根开始,每次访问二叉树的一层,知道遇到最顶端。 层次遍历
这里将上一题的队列改为双头队列,因为双头队列能在队头、队尾同时进行出队、入队操作。

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL) {}
 * };
 */
class Solution {
public:
	vector<int> rightSideView(TreeNode* root) {
		vector<int> result;
		deque<TreeNode*> myQueue;//双头辅助队列,用于层次遍历
		if (root == NULL) {
			return result;
		}
		myQueue.push_back(root);
		TreeNode *tempNodePtr = NULL;
		while (!myQueue.empty()) {
            result.push_back(myQueue.back()->val);//将此层的最右端节点值
			int tempQueueSize = myQueue.size();//此时队列的大小(即将访问的层的节点数目)
			for (int i = 0; i < tempQueueSize; ++i) {//将此层的所有节点出队列
				tempNodePtr = myQueue.front();//获取队头
				myQueue.pop_front();
				if (tempNodePtr->left != NULL) {//放置左子树根节点
					myQueue.push_back(tempNodePtr->left);
				}
				if (tempNodePtr->right != NULL) {//放置右子树根节点
					myQueue.push_back(tempNodePtr->right);
				}
			}
		}
		return result;
	}
};

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_41855420/article/details/87990368
今日推荐