二叉树的学习

关于二叉树的四种遍历:前序遍历,中序遍历,后续遍历,层序遍历

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);
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值