关于二叉树的四种遍历:前序遍历,中序遍历,后续遍历,层序遍历
class Node{
public char val;
public Node left;
public Node right;
public Node(char val) {
this.val = val;
}
}
public class TestTree {
//构造一个树
public static Node build(){
Node a=new Node('A');//a为根节点的引用
Node b=new Node('B');
Node c=new Node('C');
Node d=new Node('D');
Node e=new Node('E');
Node f=new Node('F');
Node g=new Node('G');
Node h=new Node('H');
a.left=b;
a.right=c;
b.left=d;
b.right=e;
e.left=g;
g.right=h;
c.right=f;
return a;//返回根节点的引用
}
//前序遍历
public static void preOder(Node root){
if(root==null){
return;
}
System.out.print(root.val+" ");
preOder(root.left);
preOder(root.right);
}
//中序遍历
public static void inOder(Node root){
if(root==null){
return;
}
inOder(root.left);
System.out.print(root.val+" ");
inOder(root.right);
}
//后续遍历
public static void postOder(Node root){
if(root==null){
return;
}
postOder(root.left);
postOder(root.right);
System.out.print(root.val+" ");
}
public static void main(String[] args){
Node root=build();
System.out.println("前序遍历");
preOder(root);
System.out.println();
System.out.println("中序遍历");
inOder(root);
System.out.println();
System.out.println("后续遍历");
postOder(root);
System.out.println("节点个数为:");
System.out.println(size(root));//8
}
求二叉树节点的个数
public static int size(Node root){
if(root==null){
return 0;
}
//访问根节点 整个树节点的个数=根节点个数+左子树个数+右子树个数
return 1+size(root.left)+size(root.right);
}
求二叉树叶子节点的个数
public static int leafSize(Node root){
if(root==null){
return 0;
}
if(root.left==null&&root.right==null){
return 1;
}
return leafSize(root.left)+leafSize(root.right);
}
求二叉树第k层节点个数 k层节点个数=左子树的k-1层节点个数+右子树的k-1层节点个数
public static int kLevelSize(Node root,int k){
if(k<1||root==null){
return 0;
}
if(k==1){
return 1;
}
return kLevelSize(root.left,k-1)+kLevelSize(root.right,k-1);
}
在二叉树中查找指定元素,如果存在返回节点引用,不存在返回Null
Node find(Node root,char toFind){
if(root==null){
return null;
}
if(root.val==toFind){
return root;
}
//分别递归去查找左右子数
Node result=find(root.left,toFind);
if(result!=null){
return result;
}
//在左子树没有找到,进行右子树
return find(root.right,toFind);
}
}