树的遍历
一、基础算法
数据结构
public class TreeNode {
int val;
TreeNode left;
TreeNode right;
TreeNode(int x) { val = x; }
}
1.层序遍历
利用队列,对于出队列的节点让其左右子节点入队
public int layerNum(TreeNode node){
if(node==null)
return 0;
int left=layerNum(node.left);
int right=layerNum(node.right);
return left>right?left+1:right+1;
}
2.求层数
递归求左右子树的最大层数+1
public int layerNum(TreeNode node){
if(node==null)
return 0;
int left=layerNum(node.left);
int right=layerNum(node.right);
return left>right?left+1:right+1;
}
3.遍历-先序
非递归
public void nonRecPreOrder(TreeNode root){
Stack<TreeNode> stack=new Stack<TreeNode>();
while(root!=null||!stack.isEmpty()){
if(root!=null){
System.out.print(root.val+" ");
stack.push(root);
root=root.left;
} else {
root=stack.pop();
root=root.right;
}
}
递归
public void preOrder(TreeNode root){
if(root==null)
return;
System.out.print(root.val+" ");
preOrder(root.left);
preOrder(root.right);
}
4.遍历-中序
非递归
public void nonRecInOrder(TreeNode root){
Stack<TreeNode> stack=new Stack<TreeNode>();
while(root!=null||!stack.isEmpty()){
if(root!=null){
stack.push(root);
root=root.left;
} else {
root=stack.pop();
System.out.print(root.val+" ");
root=root.right;
}
}
}
递归
public void inOrder(TreeNode root){
if(root==null)
return;
inOrder(root.left);
System.out.print(root.val+" ");
inOrder(root.right);
}
5.后序遍历
递归
public void postOrder(TreeNode root){
if(root==null)
return;
postOrder(root.left);
postOrder(root.right);
System.out.print(root.val+" ");
}
后序非递归?
先中后的非递归还有别的方法