二叉树操作

62 篇文章 1 订阅
15 篇文章 0 订阅

二叉树定义:

public class TreeNode
{
    int val;
    TreeNode left;  //左子树
    TreeNode right; //右子树

    public TreeNode(int val)
    {
        this.val = val;
        this.left = null;
        this.right = null;
    }

    @Override
    public String toString()
    {
        return String.format("%c", val);
    }
}

操作及其方法:

public class TreeTraversal
{
    // 前序遍历
    static void preOrderTraversal(TreeNode root)
    {
        if (root != null)
        {
            //1、首先处理根节点
            System.out.printf("%c", root.val);
            size++;
            //2、按照前序处理方式,处理该节点的左子树
            preOrderTraversal(root.left);
            //3、按照前序处理方式,处理该节点的右子树
            preOrderTraversal(root.right);
        }
    }

    // 中序遍历
    static void inOrderTraversal(TreeNode root)
    {
        if (root != null)
        {
            //中序遍历左子树
            inOrderTraversal(root.left);
            //根节点
            System.out.printf("%c", root.val);
            //中序遍历右子树
            inOrderTraversal(root.right);
        }
    }

    // 后序遍历
    static void postOrderTraversal(TreeNode root)
    {
        if (root != null)
        {
            //后序遍历左子树
            postOrderTraversal(root.left);
            //后序遍历右子树
            postOrderTraversal(root.right);
            //根节点
            System.out.printf("%c", root.val);
        }
    }

    // 遍历思路-求结点个数

    static int size = 0;

    static int getSize1(TreeNode root)
    {
        size = 0;
        preOrderTraversal1(root);
        return size;
    }

    static void preOrderTraversal1(TreeNode root)   //前序查看结点数
    {
        if (root != null)
        {
            size++;
            preOrderTraversal1(root.left);
            preOrderTraversal1(root.right);
        }
    }

    // 子问题思路-求结点个数
    static int getSize2(TreeNode root)
    {
        if (root != null)
        {
            int sum = 1;
            sum += getSize2(root.left) + getSize2(root.right);
            return sum;
        }
        return 0;
    }


    // 遍历思路-求叶子结点个数
    static int leafSize = 0;

    static int getLeafSize1(TreeNode root)
    {
        int sum = 0;
        if (root != null)
        {
            if (root.left == null && root.right == null)
            {
                sum++;
            }
            sum += getLeafSize1(root.left) + getLeafSize1(root.right);
            return sum;
        }
        return 0;
    }

    static void preOrderTraversal2(TreeNode root)   //前序查看叶子结点数
    {
        if (root != null)
        {
            if (root.left == null && root.right == null)
            {
                leafSize++;
            }
            preOrderTraversal2(root.left);
            preOrderTraversal2(root.right);
        }
    }

    // 子问题思路-求叶子结点个数
    static int getLeafSize2(TreeNode root)
    {
        leafSize = 0;
        preOrderTraversal2(root);
        return leafSize;
    }

    // 子问题思路-求第 k 层结点个数
    static int getKLevelSize(TreeNode root, int k)
    {
        if (root == null)
        {
            return 0;
        } else if (k == 1)
        {
            return 1;
        } else
        {
            int leftK = getKLevelSize(root.left, k - 1);
            int rightK = getKLevelSize(root.right, k - 1);
            return leftK + rightK;
        }
    }

    // 获取二叉树的高度
    static int getHeight(TreeNode root)
    {
        if (root == null)
        {
            return 0;
        } else
        {
            int leftH = getHeight(root.left);
            int rightH = getHeight(root.right);

            return Math.max(leftH, rightH) + 1;
        }
    }

    // 查找 val 所在结点,没有找到返回 null
    // 按照 根 -> 左子树 -> 右子树的顺序进行查找
    // 一旦找到,立即返回,不需要继续在其他位置查找
    static boolean find(TreeNode root, int val)
    {
        if (root == null)   //树为空
        {
            return false;
        }
        if (root.val == val)    //判断根
        {
            return true;
        }
        boolean flag = find(root.left, val);    //判断左子树
        if (flag)
        {
            return true;
        }
        return find(root.right, val);   //判断右子树
    }

    static TreeNode find1(TreeNode root, int val)
    {
        if (root == null)   //树为空
        {
            return null;
        }
        if (root.val == val)    //判断根
        {
            return root;
        }
        find1(root.left, val);    //判断左子树

        return find1(root.right, val);   //判断右子树
    }
    static TreeNode find1(TreeNode root, int val)
    {
        if (root == null)   //树为空
        {
            return null;
        }
        if (root.val == val)    //判断根
        {
            return root;
        }
        TreeNode leftF = find1(root.left, val);    //判断左子树
        if(leftF != null)
        {
            return leftF;
        }
        return find1(root.right, val);   //判断右子树
    }
//查找树中是否有某结点
    static boolean find2(TreeNode root, TreeNode node)
    {
        if (root == null)
        {
            return false;
        }

        if (root == node)
        {
            return true;
        }

        boolean leftF = find2(root.left, node);
        if (leftF)
        {
            return true;
        }

        return find2(root.right, node);
    }
}

测试:

    public static void main(String[] args)
    {
        TreeNode a = new TreeNode('A');
        TreeNode b = new TreeNode('B');
        TreeNode c = new TreeNode('C');
        TreeNode d = new TreeNode('D');
        TreeNode e = new TreeNode('E');
        TreeNode f = new TreeNode('F');
        TreeNode g = new TreeNode('G');
        TreeNode h = new TreeNode('H');
        TreeNode i = new TreeNode('I');
        TreeNode j = new TreeNode('J');

        //连接
        a.left = b;
        a.right = c;

        b.left = d;

        c.left = e;
        c.right = f;

        d.right = g;

        f.left = h;
        f.right = i;

        g.left = j;

        System.out.printf("%s", "前序遍历:");
        preOrderTraversal(a);
        System.out.println();

        System.out.printf("%s", "中序遍历:");
        inOrderTraversal(a);
        System.out.println();

        System.out.printf("%s", "后序遍历:");
        postOrderTraversal(a);
        System.out.println();

        System.out.println("树的结点数:" + getSize1(a));
        System.out.println("树的结点数:" + getSize2(a));
        System.out.println("树的叶子结点数:" + getLeafSize2(a));
        System.out.println("树的叶子结点数:" + getLeafSize1(a));
        System.out.println("第1层结点数:" + getKLevelSize(a, 1));
        System.out.println("第2层结点数:" + getKLevelSize(a, 2));
        System.out.println("第3层结点数:" + getKLevelSize(a, 3));
        System.out.println("第4层结点数:" + getKLevelSize(a, 4));
        System.out.println("第5层结点数:" + getKLevelSize(a, 5));
        System.out.println("第6层结点数:" + getKLevelSize(a, 6));
        System.out.println("二叉树的高度:" + getHeight(a));
        System.out.println("是否有 A:" + find(a, 'A'));
        System.out.println("是否有 B:" + find(a, 'B'));
        System.out.println("是否有 B:" + find(a, 'I'));
        System.out.println("是否有 Z:" + find(a, 'Z'));

    }

运行截图:
在这里插入图片描述

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枳洛淮南✘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值