所谓遍历(Traversal)就是指沿着某条搜索路线,依次对树中每个结点均做一次且仅做一次访问,访问结点所做的操作依赖于具体的问题应用,如下图是一颗二叉树,红色路线位遍历路线
二叉树的遍历按照访问结点的顺序分为:
前序遍历(PreOrder Traversal):先访问根结点,再访问左右子树
中序遍历(InOrder Traversal):先访问左子树,然后是根结点,其次是右子树
后序遍历(PostOrder Traversal):先访问左子树,然后是右子树,最后是根结点
除了前中后序外还可以对二叉树进行层序遍历,层序遍历就是设根结点所在的一层为第一层,首先访问第一层,然后依次从左到右访问第二层上的结点,接着是第三层上的结点,以此类推,自上而下,自左至右逐层访问树的结点的过程就是层序遍历.遍历路线如图所示
前序遍历:
/**
* 前序遍历
* @param root
*/
private static void preOrderTraversal(Node root){
if(root != null){
//根 左子树的前序遍历 右子树的前序遍历
System.out.print(root.value + " ");
preOrderTraversal(root.left);
preOrderTraversal(root.right);
}
}
中序遍历:
/**
* 中序遍历
* @param root
*/
private static void inOrderTraversal(Node root){
if(root != null){
//左子树的中序遍历 根 右子树的中序遍历
inOrderTraversal(root.left);
System.out.print(root.value+" ");
inOrderTraversal(root.right);
}
}
后序遍历:
/**
* 后序遍历
* @return
*/
private static void postOrderTraversal(Node root){
if(root != null){
//左子树的后序遍历 右子树的后序遍历 根
postOrderTraversal(root.left);
postOrderTraversal(root.right);
System.out.print(root.value +" ");
}
}
求二叉树的结点个数:
/**
* 求二叉树节点个数
*/
private static int count=0;
//用前序遍历求二叉树的节点个数
private static void countByTraversal(Node root){
if(root != null){
count++;
countByTraversal(root.left);
countByTraversal(root.right);
}
}
求二叉树中国叶子结点个数:
/**
* 求二叉树叶子节点个数
* @param root
* @return
*/
private static int leafCount(Node root){
//叶子节点个数
if(root == null){
return 0;
}else if(root.left == null && root.right == null){
return 1;
}else{
return leafCount(root.left)+leafCount(root.right);
}
}
求二叉树的高度:
/**
* 求二叉树的高度
* @param root
* @return
*/
private static int height(Node root){
//空树
//其他 max(left,right)+1;
if(root == null){
return 0;
}else{
int left = height(root.left);
int right = height(root.right);
return (left>right ? left:right)+1;
}
}
求二叉树第k层的结点个数:
/**
* 求k层节点个数
* @param root
* @param k
* @return
*/
private static int kLevel(Node root,int k){
if(root == null){
return 0;
}else if(k == 1){
return 1;
}else{
return kLevel(root.left,k-1)+kLevel(root.right,k-1);
}
}
在二叉树中查找元素:
/**
* 在二叉树中查找元素
* @param root
* @param v
* @return
*/
private static Node find(Node root,char v){
if(root == null){
return null;
}
if(root.value == v){
return root;
}
Node r = find(root.left,v);
if(r != null){
return r;
}
r=find(root.right,v);
if(r != null){
return r;
}
return null;
}