随笔 - 361,  文章 - 0,  评论 - 62,  阅读 - 160万

  此测试仅用于二叉树基本的性质测试,不包含插入、删除测试(此类一般属于有序树基本操作)。

复制代码
//二叉树树类
public class BinaryTree {

    public TreeNode root;   //有一个根节点
    public static int index;

    public TreeNode CreateBTree(int[] a) {
        TreeNode root = null;
        if (a[index] != '#') {
            root = new TreeNode(a[index]);
            index++;
            root.setLChild(CreateBTree(a));
            index++;
            root.setRChild(CreateBTree(a));
        }
        return root;

    }

    //先序遍历
    public void prevOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        System.out.print(root.getData() + ",");
        prevOrder(root.getLChild());
        prevOrder(root.getRChild());
    }

    // 中序遍历
    public void midOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        midOrder(root.getLChild());
        System.out.print(root.getData() + ",");
        midOrder(root.getRChild());
    }

    // 后序遍历
    public void postOrder(TreeNode root) {
        if (root == null) {
            return;
        }
        postOrder(root.getLChild());
        postOrder(root.getRChild());
        System.out.print(root.getData() + ",");
    }

    // 获取树大小
    private int getSize(TreeNode node) {
        if (node == null) {
            return 0;
        } else {
            return 1 + getSize(node.leftChild) + getSize(node.rightChild);
        }
    }

    /*求二叉树的高*/
    public int getHeight() {
        return getHeight(this.root);
    }

    private int getHeight(TreeNode node) {
        if (node != null) { //左子树和右子树中谁大返回谁
            int i = getHeight(node.leftChild);
            int j = getHeight(node.rightChild);
            return (i > j) ? i + 1 : j + 1;
        } else {
            return 0;
        }
    }

    //获得叶子数
    public int getLeaf(TreeNode node) {
        if (node == null) {
            return 0;
        }
        if (node.leftChild == null && node.rightChild == null) {
            System.out.println("Leaf node: " + node.getData());
            return 1;
        } else {
            return getLeaf(node.leftChild) + getLeaf(node.rightChild);
        }

    }

    //获得第K层节点数
    public int getNodeKNum(TreeNode node, int k) {
        if (k == 1) {
            if (node == null)
                return 0;
            System.out.println("K Node:" + node.getData());
            return 1;
        }
        return getNodeKNum(node.getLChild(), k - 1) + getNodeKNum(node.getRChild(), k - 1);
    }

    //查找某个节点
    public TreeNode findNode(int data) {
        return findNode(this.root, data);
    }

    public TreeNode findNode(TreeNode node, int data) {
        if (node == null) {
            return null;
        } else if (node.getData() == data) {
            return node;
        }
        TreeNode leftNode = findNode(node.getLChild(), data);
        if (null != leftNode)
            return leftNode;
        TreeNode rightNode = findNode(node.getRChild(), data);
        if (null != rightNode)
            return rightNode;
        return null;
    }

    //返回某节点的父节点
    public TreeNode getParent(int data) {
        return getParent(this.root, data);
    }

    public TreeNode getParent(TreeNode node, int data) {
        if (node == null)
            return null;
        TreeNode childL = node.getLChild();
        TreeNode childR = node.getRChild();
        if ((childL != null && childL.getData() == data) || childR != null && childR.getData() == data)
            return node;
        TreeNode parentL = getParent(node.getLChild(), data);
        if (parentL != null)
            return parentL;
        TreeNode parentR = getParent(node.getRChild(), data);
        if (parentR != null)
            return parentR;
        return null;
    }

    //层次遍历,用到队列
    public void BTreeLevelOrder() {
        TreeNode root = this.root;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        LinkedList<TreeNode> list = new LinkedList<TreeNode>();
        queue.offer(root);
        while (!queue.isEmpty()) {
            TreeNode pre = queue.poll();
            list.add(pre);
            if (pre.getLChild() != null)
                queue.offer(pre.getLChild());
            if (pre.getRChild() != null)
                queue.offer(pre.getRChild());
        }
        Iterator<TreeNode> it = list.iterator();
        while (it.hasNext()) {
            TreeNode cur = it.next();
            System.out.print(cur.getData() + ", ");
        }
    }

    //判断一棵树是否是完全二叉树(层次遍历的变形)
    public boolean isCompleteBTree() {
        TreeNode root = this.root;
        Queue<TreeNode> queue = new LinkedList<TreeNode>();
        queue.offer(root);

        while (!queue.isEmpty()) {
            TreeNode node = queue.poll();
            if (node == null)
                break;
            queue.offer(node.getLChild());
            queue.offer(node.getRChild());

        }
        while (!queue.isEmpty()) {
            TreeNode cur = queue.poll();
            if (cur != null)
                return false;
        }
        return true;

    }

    class TreeNode {
        private TreeNode leftChild;
        private TreeNode rightChild;
        private int data;

        public TreeNode(int data) {
            this.data = data;
        }

        public void setLChild(TreeNode left) {
            this.leftChild = left;
        }

        public void setRChild(TreeNode right) {
            this.rightChild = right;
        }

        public void setData(int data) {
            this.data = data;
        }

        public int getData() {
            return this.data;
        }

        public TreeNode getLChild() {
            return this.leftChild;
        }

        public TreeNode getRChild() {
            return this.rightChild;
        }
    }

    public static void main(String[] agrs) {
        BinaryTree tree = new BinaryTree();
        int[] a = new int[]{1, 2, 3, '#', '#', 4, '#', '#', 5, 6, '#', '#', '#'};
//        int[] a = new int[]{1, 2, '#', 3, '#', '#', 4, '#', 5, 6, '#', '#', '#'};
        //                  1
        //                /   \
        //              2       5
        //             / \     / \
        //            3   4   6   #
        //           / \ / \ / \
        //           # # # # # #
        tree.root = tree.CreateBTree(a);
        System.out.print("先序遍历:");
        tree.prevOrder(tree.root);
        System.out.print("\n中序遍历:");
        tree.midOrder(tree.root);
        System.out.print("\n后序遍历:");
        tree.postOrder(tree.root);
        System.out.println();

        System.out.println("Tree size Num: " + tree.getSize(tree.root));
        System.out.println("Tree Leaf Num: " + tree.getLeaf(tree.root));
        System.out.println("K=2 num: " + tree.getNodeKNum(tree.root, 2));
        System.out.println("Tree height: " + tree.getHeight());

        System.out.println("3 find: " + tree.findNode(3).getData());
        System.out.println("1 find: " + tree.findNode(1).getData());
        System.out.println("6 find: " + tree.findNode(6).getData());
        System.out.println("7 find: " + tree.findNode(7));

        System.out.println("6 parent node is : " + tree.getParent(6).getData());
        System.out.println("3 paren node is : " + tree.getParent(3).getData());
        System.out.println("5 paren node is : " + tree.getParent(5).getData());
        System.out.println("1 paren node is : " + tree.getParent(1));
        System.out.print("层序遍历:");
        tree.BTreeLevelOrder();
        System.out.println();

        System.out.println("the tree is complete?  " + tree.isCompleteBTree());

    }
}
复制代码

 

posted on   kosamino  阅读(475)  评论(0编辑  收藏  举报
编辑推荐:
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2018-10-24 Shell脚本中"command not found"报错处理

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
点击右上角即可分享
微信分享提示