二叉树遍历是比较基础的常规操作,没什么难度。主要有三种遍历方式
- 前序遍历:(根、左、右)
- 中序遍历:(左、根、右)
- 后续遍历:(左、右、根)
递归的方式很简单、这里不多说明。主要说明一下利用栈先进后出的特性非递归方式遍历
前序遍历:
1.对于任意节点current,若该节点不为空则访问该节点后再将节点压栈,并将左子树节点置为current,重复此操作,直到current为空。
2.若左子树为空,栈顶节点出栈,将该节点的右子树置为current
3.重复1、2步操作,直到current为空且栈内节点为空。
中序遍历:
1.对于任意节点current,若该节点不为空则将该节点压栈,并将左子树节点置为current,重复此操作,直到current为空。
2.若左子树为空,栈顶节点出栈,访问节点后将该节点的右子树置为current
3.重复1、2步操作,直到current为空且栈内节点为空。
后序遍历:
利用栈迭代后再反转,后序遍历的顺序为左、右、根, 其逆序为根、右、左。利用栈可以很简单的先对二叉树按照其逆序的方式正常进行遍历后、再将遍历的顺序反转就得到其后序遍历序列
//整体代码如下
public class Solution {
/**
*
* @param root TreeNode类 the root of binary tree
* @return int整型二维数组
*/
public int[][] threeOrders (TreeNode root) {
int size = getSize(root);
if(size == 0)
return new int[0][0];
int[][] result = new int[3][size];
//先序遍历
result[0] = preOrderByStack(root, size);
//中序遍历
result[1] = inOrderByStack(root, size);
//后续遍历二叉树
result[2] = postOrderByStack(root, size);
return result;
}
//利用栈先序遍历二叉树
private int[] preOrderByStack(TreeNode root, int size){
int[] arr = new int[size];
int idx = 0;
//初始化栈
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(!stack.isEmpty() || cur != null){
if(cur != null){
//遍历当前节点后、压栈
arr[idx++] = cur.val;
stack.push(cur);
cur = cur.left;
}
if(cur == null){
//栈顶节点出栈、当前节点置为右子树
TreeNode temp = stack.pop();
cur = temp.right;
}
}
return arr;
}
//利用栈中序遍历二叉树
private int[] inOrderByStack(TreeNode root, int size){
int[] arr = new int[size];
int idx = 0;
//初始化栈
Stack<TreeNode> stack = new Stack<>();
TreeNode cur = root;
while(!stack.isEmpty() || cur != null){
if(cur != null){
//节点压栈
stack.push(cur);
cur = cur.left;
}
if(cur == null){
//栈顶节点出栈
TreeNode temp = stack.pop();
//访问当前节点后、将cur置为右子树
arr[idx++] = temp.val;
cur = temp.right;
}
}
return arr;
}
//利用栈后续遍历二叉树(利用栈迭代反转)
public int[] postOrderByStack(TreeNode root, int size){
int[] arr = new int[size];
int idx = size - 1;
Stack<TreeNode> stack = new Stack<>();
stack.push(root);
while(!stack.isEmpty()){
TreeNode temp = stack.pop();
arr[idx--] = temp.val;
if(temp.left != null)
stack.push(temp.left);
if(temp.right != null)
stack.push(temp.right);
}
return arr;
}
private int getSize(TreeNode root){
if(root == null)
return 0;
int sizeL = getSize(root.left);
int sizeR = getSize(root.right);
return sizeL + sizeR + 1;
}
}
京公网安备 11010502036488号