前言:
在之前,我们写到了二叉树的递归 先、中、后序的遍历方式,今天,来讨论这三种遍历方式的非递归实现!!
思路: 类似于层序遍历
代码实现:
public List<Integer> preorderTraversal(Node root) {
List<Integer> result = new ArrayList<>();
// 空树判断
if(root == null){
return result;
}
// 创建一个栈
Stack<Node> stack = new Stack<>();
Node cur = root;
while(!stack.isEmpty() || cur != null){
while(cur != null){
result.add(cur.val);
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
cur = cur.right;
}
return result;
}
思路:
仍然先要创建一个栈,创建一个 cur ,从根节点出发,循环往左找,一直找到 null 为止,路径上遇到的节点都入栈
遇到 null 的时候,就取栈顶元素,并访问(打印)
再让 cur 从当前栈顶元素的右子树出发,循环刚才的过程
代码实现:
public List<Integer> inorderTraversal(Node root) {
//创建一个List
List<Integer> result = new ArrayList<>();
//空树判断
if(root == null){
return result;
}
Stack<Node> stack = new Stack<>();
Node cur = root;
while(!stack.isEmpty() || cur != null){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
result.add(cur.val);
cur = cur.right;
}
return result;
}
思路: 和中序遍历很像
先创建一个栈,创建一个 cur,从根节点出发,循环往左找,一直找到 null 为止,路径上遇到的节点都入栈,(此时还不能访问,若栈顶元素的右子树为 null,或右子树已经被访问过了,才能访问栈顶元素)
右子树是否已经访问:使用一个 prev 记录下后序遍历过程中最后一个被访问到的元素
代码实现:
public List<Integer> postorderTraversal(Node root) {
//创建一个List
List<Integer> result = new ArrayList<>();
//空树判断
if(root == null){
return result;
}
Stack<Node> stack = new Stack<>();
Node cur = root;
Node prev = null;
while(cur != null || !stack.isEmpty()){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
cur = stack.pop();
if(cur.right == null || cur.right == prev){
result.add(cur.val);
prev = cur;
cur = null;
}
else {
stack.push(cur);
cur = cur.right;
}
}
return result;
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/m0_47988201/article/details/121134759
内容来源于网络,如有侵权,请联系作者删除!