二叉树 非递归遍历
非递归遍历我总结了一套模板
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
// 记录栈弹出且删除的节点
TreeNode pop = null;
while (!stack.isEmpty() || node != null) {
if (node != null) {
// 待处理左子树
// 将节点压入栈
stack.push(node);
// 前序遍历 在处理左子树之前进行操作
list.add(node.val);
node = node.left;
} else {
//处理右子树
// 记录栈顶元素
TreeNode peek = stack.peek();
// 没有右子树
if (peek.right == null) {
// 中序遍历 在处理右子树之前进行操作
list.add(peek.val);
pop = stack.pop();
// 后序遍历 在处理右子树之后进行操作
list.add(pop.val);
}
// 右子树处理完成
else if (peek.right == pop) {
pop = stack.pop();
// 后序遍历 在处理右子树之后进行操作
list.add(pop.val);
}
// 待处理右子树
else {
// 中序遍历 在处理右子树之前进行操作
list.add(peek.val);
node = peek.right;
}
}
}
return list;
}
}
创建二叉数-节点
public 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;
}
}
二叉树前序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
// 记录栈弹出且删除的节点
TreeNode pop = null;
while (!stack.isEmpty() || node != null) {
if (node != null) {
// 待处理左子树
// 将节点压入栈
stack.push(node);
// 前序遍历 在处理左子树之前进行操作
list.add(node.val);
node = node.left;
} else {
//处理右子树
// 记录栈顶元素
TreeNode peek = stack.peek();
// 没有右子树
if (peek.right == null) {
pop = stack.pop();
}
// 右子树处理完成
else if (peek.right == pop) {
pop = stack.pop();
}
// 待处理右子树
else {
node = peek.right;
}
}
}
return list;
}
}
二叉树中序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
// 记录栈弹出且删除的节点
TreeNode pop = null;
while (!stack.isEmpty() || node != null) {
if (node != null) {
// 待处理左子树
// 将节点压入栈
stack.push(node);
node = node.left;
} else {
//处理右子树
// 记录栈顶元素
TreeNode peek = stack.peek();
// 没有右子树
if (peek.right == null) {
// 中序遍历 在处理右子树之前进行操作
list.add(peek.val);
pop = stack.pop();
}
// 右子树处理完成
else if (peek.right == pop) {
pop = stack.pop();
}
// 待处理右子树
else {
// 中序遍历 在处理右子树之前进行操作
list.add(peek.val);
node = peek.right;
}
}
}
return list;
}
}
二叉树后序遍历
class Solution {
public List<Integer> preorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
if (root == null) {
return list;
}
Stack<TreeNode> stack = new Stack<TreeNode>();
TreeNode node = root;
// 记录栈弹出且删除的节点
TreeNode pop = null;
while (!stack.isEmpty() || node != null) {
if (node != null) {
// 待处理左子树
// 将节点压入栈
stack.push(node);
node = node.left;
} else {
//处理右子树
// 记录栈顶元素
TreeNode peek = stack.peek();
// 没有右子树
if (peek.right == null) {
pop = stack.pop();
// 后序遍历 在处理右子树之后进行操作
list.add(pop.val);
}
// 右子树处理完成
else if (peek.right == pop) {
pop = stack.pop();
// 后序遍历 在处理右子树之后进行操作
list.add(pop.val);
}
// 待处理右子树
else {
node = peek.right;
}
}
}
return list;
}
}