一、前序遍历:
思想:先创建一个Stack用来存放节点,此时Stack为空,先将root结点放入stack,前序遍历是先根后左再右,结合栈的先进后出的特点,再入栈的应该是右节点,因此判断若结点的右子树不为空则入栈,再判断左子树进行入栈,代码示例:
public List<Integer> preorderTraversal(TreeNode root) {
Stack<TreeNode> stack = new Stack<>();
List<Integer> list = new LinkedList<>();
if(root == null){
return list;
}
stack.push(root);
while(!stack.isEmpty()){
TreeNode node = stack.pop();
list.add(node.val);
if(node.right != null){
stack.push(node.right);
}
if(node.left != null){
stack.push(node.left);
}
}
return list;
}
二、中序遍历
思想:创建一个Stack,然后按左中右添加进链表,尽可能的将这个节点的左子树入栈,此时栈顶的元素是最左侧的元素,如果有右节点,也要进行中序遍历。
public List<Integer> inorderTraversal(TreeNode root) {
List<Integer> list = new LinkedList<>();
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(!stack.isEmpty() || cur != null){
while(cur != null){
stack.push(cur);
cur = cur.left;
}
TreeNode node = stack.pop();
list.add(node.val);
if(node.right != null){
cur = node.right;
}
}
return list;
}
三、后序遍历
public List<Integer> postorderTraversal(TreeNode root) {
LinkedList<TreeNode> stack = new LinkedList<>();
LinkedList<Integer> output = new LinkedList<>();
if (root == null) {
return output;
}
stack.add(root);
while (!stack.isEmpty()) {
TreeNode node = stack.pollLast();
output.addFirst(node.val);
if (node.left != null) {
stack.add(node.left);
}
if (node.right != null) {
stack.add(node.right);
}
}
return output;
}