仅为个人记录复盘学习历程,解题思路来自代码随想录
代码随想录刷题笔记总结网址:
代码随想录
二叉树的统一迭代法
二叉树的统一迭代指的是二叉树的前序遍历,中序遍历,后序遍历使用迭代法实现时,在方法和形式上较为统一的迭代方法。二叉树的前序遍历,中序遍历,后序遍历之所以无法统一是因为无法同时解决访问节点(遍历节点)和处理节点(将元素放进结果集)不一致的情况。那么可以将访问的节点放入栈中,把要处理的节点也放入栈中但是要做标记,这样就能够实现统一迭代。
统一迭代法的中序遍历代码示例:
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer>res=new ArrayList<>();
Stack<TreeNode>stack=new Stack<>();
if(root!=null) stack.push(root);
while(!stack.isEmpty()){
//记录栈顶元素
TreeNode node=stack.peek();
//不为空
if(node!=null){
//弹出栈顶元素
stack.pop();
//右,中,左加入
if(node.right!=null)
stack.push(node.right);
stack.push(node);
stack.push(null);
if(node.left!=null)
stack.push(node.left);
}
//为空
else{
//弹出空节点,将值加入结果集
stack.pop();
res.add(stack.peek().val);
stack.pop();
}
}
return res;
}
统一迭代法的前序遍历代码只需要将统一迭代法的中序遍历代码节点加入顺序改变即可:
//右,左,中加入
if(node.right!=null)
stack.push(node.right);
if(node.left!=null)
stack.push(node.left);
stack.push(node);
stack.push(null);
统一迭代法的后序遍历代码同样只需要将统一迭代法的中序遍历代码节点加入顺序改变即可:
//中,右,左加入
stack.push(node);
stack.push(null);
if(node.right!=null)
stack.push(node.right);
if(node.left!=null)
stack.push(node.left);
二叉树的层序遍历(广度优先)
层序遍历一个二叉树。就是从左到右一层一层的去遍历二叉树。这种遍历的方式和我们之前讲过的都不太一样。需要借用一个辅助数据结构即队列来实现,队列先进先出,符合一层一层遍历的逻辑,而用栈先进后出适合模拟深度优先遍历也就是递归的逻辑。
层序遍历时,先将根节点加入队列,然后每次队列弹出节点就将它的非空左右节点加入队列中,直到队列为空为止。
102.二叉树的层序遍历
给你一个二叉树,请你返回其按 层序遍历 得到的节点值。
提供参数:根结点root
主要操作:
定义接收结果的二维数组res(每层结果使用一维数组接收)
定义队列容器queue
将根节点root放入queue
当queue不为空时,循环操作:
定义用来接收每层数据的一维数组temp
定义当前层的长度len(该层有多少个节点长度就为多少)
遍历每个节点进行以下操作:
将该结点数据存入temp
如果该结点左子节点不为空,将左子节点加入queue;
如果该结点右子节点不为空,将右子节点加入queue。
在每次遍历完一层的数据后,将temp加入res。
循环结束(队列为空)后,返回结果res。
代码示例如下:
public List<List<Integer>>res=new ArrayList<List<Integer>>();
public List<List<Integer>> levelOrder(TreeNode root) {
if(root==null)return res;
layerorder(root);
return res;
}
public void layerorder(TreeNode root){
//初始化,需要的队列,将root加入队列
Queue<TreeNode>queue=new LinkedList<TreeNode>();
queue.offer(root);
//当队列不为空,持续进行
while(!queue.isEmpty()){
//初始化需要的容器
List<Integer>temp=new ArrayList<>();
//初始化长度,代表每层有多少个数据
int len=queue.size();
for(int i=0;i<len;i++){
TreeNode node=queue.poll();
temp.add(node.val);
if(node.left!=null)queue.offer(node.left);
if(node.right!=null)queue.offer(node.right);
}
res.add(temp);
}
}
标签:node,遍历,随想录,日记,push,节点,null,stack,刷题
From: https://blog.csdn.net/weixin_73939095/article/details/143208848