二叉树遍历
二叉树定义:
class TreeNode{
int val;//结点的值
TreeNode left;//左结点
TreeNode right;//右结点
public TreeNode(int val){
this.val = val;
}
}
前序遍历
前序遍历是先打印根结点值,再遍历左子树和右子树。
两种实现:
1. 递归实现,代码如下:
public static void preOrderTree(TreeNode root){
if(root == null)
return;
System.out.print(root.val+" ");
preOrderTree(root.left);
preOrderTree(root.right);
}
2. 非递归实现,代码如下:
public static void preOrderTree2(TreeNode root){
if(root == null)
return;
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.isEmpty()){
while(root != null ){
System.out.print(root.val+" ");
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()){
root = stack.pop();
root = root.right;
}
}
}
测试:
public static void main(String[] args) {
TreeNode root = new TreeNode(8);
TreeNode node1 = new TreeNode(6);
TreeNode node2 = new TreeNode(10);
TreeNode node3 = new TreeNode(5);
TreeNode node4 = new TreeNode(7);
TreeNode node5 = new TreeNode(9);
TreeNode node6 = new TreeNode(11);
root.left = node1;
root.right = node2;
node1.left = node3;
node1.right = node4;
node2.left = node5;
node2.right = node6;
// preOrderTree(root);
preOrderTree2(root);
}
中序遍历
中序遍历是先遍历左子树,再遍历根结点和右子树。
两种实现:
1. 递归实现,代码如下:
public static void inOrderPrint(TreeNode root){
if(root == null)
return;
inOrderPrint(root.left);
System.out.print(root.val+" ");
inOrderPrint(root.right);
}
2. 非递归实现,代码如下:
public static void inOrderPrint2(TreeNode root){
if(root == null)
return;
Stack<TreeNode> stack = new Stack<>();
while(root != null || !stack.isEmpty()){
while(root != null){
stack.push(root);
root = root.left;
}
if(!stack.isEmpty()){
root = stack.pop();
System.out.println(root.val);
root = root.right;
}
}
}
后序遍历
后序遍历是先遍历左右子树,再遍历根结点。
代码实现:
public static void afterOrderTree(TreeNode root){
if(root == null)
return;
afterOrderTree(root.left);
afterOrderTree(root.right);
System.out.print(root.val+" ");
}