一、二叉树的层序遍历
-
本题采用非递归的方式进行层序遍历。使用队列来实现。
-
先判断根节点是否为空,如果不为空就入队,接着再把根节点的左右子树入队,然后都出队,
//层序遍历
//可以引伸出的题目
//求树的最大宽度,求树的左视图
void levelOrder2(TreeNode root){
if(root==null)return;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode cur=queue.poll();
System.out.println(cur.val+" ");//如果不为空,就放到队列里面,然后弹出去,在打印它
if(cur.left!=null){
queue.offer(cur.left);
}
if(cur.right!=null){
queue.offer(cur.right);
}
}
}
二、二叉树的右视图
1、方法一:广度优先搜索
- 利用广度优先搜索进行层次遍历
- 记录下每层最后一个元素
- 时间复杂度:O(n) 因为每个节点都入队和出队了一次
- 空间复杂度:O(n) 因为通过额外的队列空间来存储每一层的节点
class Solution{
public List<Integer> rightSideView(TreeNode root){
List<Integer> res=new ArrayList<>();//res里面存放右视图的节点
if(root==null){
return res;//如果结点是空,直接返回null的res
}
Queue<TreeNode>queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){ //遍历当前层的所有节点
TreeNode node=queue.poll();
if(node.left!=null){
queue.offer(node.left);//将当前节点的左孩子入队
}
if(node.right!=null){
queue.offer(node.right);//将当前节点的右孩子入队
}
if(i==size-1){ //将当前层的最后一个节点放入结果列表
res.add(node.val);
}
}
}
return res;
}
}
2、方法二:深度优先搜索
- 按照根节点-》右子树-》左子树的顺序访问,可以保证每层都是最先访问最右边的节点。
class Solution{
List<Integer> res =new ArrayList<>();//定义结果列表
public List<Integer> rightSideView(TreeNode root){
dfs(root,0);//从根节点开始访问,深度为0
return res;
}
private void dfs(TreeNode root,int depth){
if(root==null)return;
if(depth==res.size())res.add(root.val);
//如果当前节点所在的深度还没有出现在res里面,
// 说明在该深度下当前节点是第一个被访问的节点,因此将该节点加入res当中
depth++;
dfs(root.right,depth);//递归访问右子树
dfs(root.left,depth);//递归访问左子树
}
}
三、二叉树的左视图
```javascript
class Solution{
public List<Integer> rightSideView(TreeNode root){
List<Integer> res=new ArrayList<>();//res里面存放右视图的节点
if(root==null){
return res;//如果结点是空,直接返回null的res
}
Queue<TreeNode>queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
int size=queue.size();
for(int i=0;i<size;i++){ //遍历当前层的所有节点
TreeNode node=queue.poll();
if(node.left!=null){
queue.offer(node.left);//将当前节点的左孩子入队
}
if(node.right!=null){
queue.offer(node.right);//将当前节点的右孩子入队
}
if(i==0){ //将当前层的最后一个节点放入结果列表
res.add(node.val);
}
}
}
return res;
}
}
四、二叉树的俯视图
思路:使用二叉树的层序遍历,倒着往上铺,则上层的元素会覆盖下层的元素。
在这里插入代码片
五、判断是否是完全二叉树
// 判断一棵树是不是完全二叉树
boolean isCompleteTree(TreeNode root){
if(root==null)return true;
Queue<TreeNode> queue=new LinkedList<>();
queue.offer(root);
while(!queue.isEmpty()){
TreeNode cur=queue.poll();
if(cur!=null){//只要节点不为空,就把子节点全部放入队列当中
queue.offer(cur.left);
queue.offer(cur.right);
}else{
break;
}
}
while(queue.isEmpty()){
TreeNode cur=queue.peek();
if(cur!=null)return false;
else queue.poll();
}
return true;
}