1.二叉树的右视图
给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
示例:
输入: [1,2,3,null,5,null,4]
输出: [1, 3, 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> res; vector<int> rightSideView(TreeNode* root) { dfs(root,0); return res; } //根右左的顺序做深度优先搜索 void dfs(TreeNode* root,int depth) { if(root==nullptr) return; //如果深度与vector的大小相等,就放入节点值 if(depth==res.size()) { res.push_back(root->val); } depth++; dfs(root->right,depth); dfs(root->left,depth); } };
思路二:广度优先搜索---利用 BFS 进行层次遍历,记录下每层的最后一个元素。
/** * 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> res; if(root==nullptr) return res; queue<TreeNode*> q; q.push(root); while(!q.empty()) { int size=q.size(); for(int i=0;i<size;i++) { TreeNode* p=q.front(); q.pop(); if(p->left) { q.push(p->left); } if(p->right) { q.push(p->right); } if(i==size-1)//将当前节点的最后一个节点放入结果列表 { res.push_back(p->val); } } } return res; } };