LeetCode 199 二叉树的右边视图
leetcode.com/problems/bi…
举个例子如下:
Input: [1,2,3,null,5,null,4]
Output: [1, 3, 4]
Explanation:
看到此题目第一想到的是分层遍历
代码如下:
//node的类定义
static class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode() {
}
TreeNode(int val) {
this.val = val;
}
TreeNode(int val, TreeNode left, TreeNode right) {
this.val = val;
this.left = left;
this.right = right;
}
}
//方法实现
public List<Integer> rightSideView(TreeNode root) {
List<Integer> result = new LinkedList<>();
//判空校验
if (root == null) {
return result;
}
LinkedList<TreeNode> temp = new LinkedList();
存放遍历元素的队列
temp.add(root);
while (!temp.isEmpty()) {
//当前层剩余严肃的个数
int size = temp.size();
//是否弹出过第一个元素
//此变量的位置一定要确定
boolean bool = false;
//判断当前的层次是否还有剩余元素
while (size > 0) {
//弹出队列的开头元素。这一步一直进行
TreeNode node = temp.poll();
if (node.right != null) {
temp.offer(node.right);
}
if (node.left != null) {
temp.offer(node.left);
}
int value = node.val ;
//如果本层没有弹出过元素,
if (!bool) {
result.add(value);
//表示本层的队列元素已经弹出过
bool = true;
}
size--;
}
}
return result;
}
//执行代码
public static void main(String [] args) {
TreeNode root1 = new TreeNode(1);
TreeNode root1 = new TreeNode(1);
TreeNode root2 = new TreeNode(2);
TreeNode root3 = new TreeNode(3);
TreeNode root4 = new TreeNode(4);
TreeNode root5 = new TreeNode(5);
TreeNode root6 = new TreeNode(6);
TreeNode root7 = new TreeNode(7);
root2.right =root5;
root3.right = root4;
root1.right = root3;
root1.left = root2;
root5.left= root6;
root3.left = root7;
Object res = new Test().rightSideView(root1);
System.out.println(res);
}
以上为第一中bfs遍历的方法。其实也可以用dfs遍历的方法。
public List<Integer> rightSideView (TreeNode root) {
List<Integer> result = new LinkedList();
if (root == null) {
return result;
}
dfs (root,result,1);
return result;
}
/**
*/
public void dfs (TreeNode root,List<Integer> list,int depth) {
if (root == null) {
return;
}
//如果当前节点,小于个数,表示当前深度没有被看到过。
//因此需要把当前节点,接到结果中。
if (list.size()<depth) {
list.add(root.val);
}
dfs (root.right,list,depth+1);
dfs (root.left,list,depth+1);
}
如果要查看二叉树的左视图也可以。
只需要将 dfs的顺序调换即可
public List<Integer> rightSideView (TreeNode root) {
List<Integer> result = new LinkedList();
if (root == null) {
return result;
}
dfs (root,result,1);
return result;
}
/**
*/
public void dfs (TreeNode root,List<Integer> list,int depth) {
if (root == null) {
return;
}
//如果当前节点,小于个数,表示当前深度没有被看到过。
//因此需要把当前节点,接到结果中。
if (list.size()<depth) {
list.add(root.val);
}
dfs (root.left,list,depth+1);
dfs (root.right,list,depth+1);
}