题目:给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。
分析:从右边看树的节点,其实就是每层的最右侧的节点(但并不一定是右孩子节点),我用的层次遍历,每当遍历到每层最后一个节点时,将此节点的值用ArrayList集合接收,并最终返回。
本文链接~:
https://blog.csdn.net/qq_41934760/article/details/105689903
代码如下:
class Solution {
public List<Integer> rightSideView(TreeNode root) {
ArrayList<Integer> arr =new ArrayList<>();//存储将要输出的节点值
ArrayList<TreeNode> que =new ArrayList<>();//存储节点
int push=0,q=0;//push用来入队,q用来出队
TreeNode last=root,newlast=root;//last用来标记每层最后一个节点,newlast指向新入队列的孩子节点
TreeNode p=root;
if(p==null){
return arr;//如果树为空,返回:[]
}
que.add(p);//将根节点入队
//arr.add(p.val);
push++;//指针向前移动
while(push!=q){//当队列非空时(当节点全都出队时q=push,树遍历完毕)
p=que.get(q);//读取队头节点
//每次取出一个节点读取他的左右孩子实现遍历
q++;//被读取的节点出队
if(p.left!=null){
que.add(p.left);
push++;//入队,指针前进;
newlast=p.left;//newlast指针指向队尾节点
}
if(p.right!=null){
que.add(p.right);
push++;
newlast=p.right;
}
if(p==last){
//p指针遍历到每层的最后一个节点时( 由last指向),newlast指针也指向下一层的最后一个节点(last的孩子节点)
Integer value = last.val;
arr.add(value);
last=newlast;//本层遍历完毕,last指针移动到下一层最后一个节点
}
}
return arr;
}
}