欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Java二叉树的实现(含各种方法)

程序员文章站 2024-01-15 20:27:28
...

数据结构:二叉树

此文章包含建立二叉树,遍历二叉树,和二叉树的各种方法的实现与调用,适合萌新小白阅读加深对二叉树的理解。

此文章为作者原创 禁止转载 侵权必究

代码如下:


	
	/**
	 *  二叉树方法的各种实现
	 */

	import java.util.ArrayList;
	import java.util.concurrent.LinkedBlockingDeque;

	public class BinaryTreeDemo2 {

	    //二叉树节点
	    static class BinaryTreeNode {

	        private String data;  //数据
	        private BinaryTreeNode leftChild;  //左孩子
	        private BinaryTreeNode rightChild; //右孩子


	        BinaryTreeNode(String value) {
	            data = value;
	        }

	        public String getData() {
	            return data;
	        }

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

	        public BinaryTreeNode getLeftChild() {
	            return leftChild;
	        }

	        public void setLeftChild(BinaryTreeNode leftChild) {
	            this.leftChild = leftChild;
	        }

	        public BinaryTreeNode getRightChild() {
	            return rightChild;
	        }

	        public void setRightChild(BinaryTreeNode rightChild) {
	            this.rightChild = rightChild;
	        }
	    }

	    //二叉树
	    static class BinaryTree {
	        private BinaryTreeNode root;

	        //初始化二叉树
	        public BinaryTree() {
	        }

	        public BinaryTree(BinaryTreeNode root) {
	            this.root = root;
	        }

	        public void setRoot(BinaryTreeNode root) {
	            this.root = root;
	        }

	        public BinaryTreeNode getRoot() {
	            return root;
	        }

	        //清空树
	        public void clear() {
	            clear(root);
	        }


	        //二叉树的查找算法
	        public BinaryTreeNode searchNode(String value) {
	            BinaryTreeNode x = new BinaryTreeNode(value);
	            if (root != null) {
	                if (root.getData().equals(x.getData()))     //对根节点进行判断
	                    return root;
	                else {
	                    BinaryTreeNode lresult = searchNode(root.getLeftChild(), x);  //查找左子树
	                    //若在左子树中查找到值为x的结点,则返回该结点;否则,在右子树中查找该结点并返回结果
	                    return lresult != null ? lresult : searchNode(root.getRightChild(), x);
	                }
	            }
	            return null;
	        }

	        //二叉树的查找算法
	        private BinaryTreeNode searchNode(BinaryTreeNode root, BinaryTreeNode x) {

	            if (root != null) {
	                if (root.getData().equals(x.getData()))     //对根节点进行判断
	                    return root;
	                else {
	                    BinaryTreeNode lresult = searchNode(root.getLeftChild(), x);  //查找左子树
	                    //若在左子树中查找到值为x的结点,则返回该结点;否则,在右子树中查找该结点并返回结果(地址)
	                    return lresult != null ? lresult : searchNode(root.getRightChild(), x);
	                }
	            }
	            return null;
	        }


	        //判断二叉树是否为空
	        public boolean isEmpty() {
	            return root == null;
	        }

	        //获取二叉树的高度
	        public int height() {
	            return height(root);
	        }

	        //获取二叉树的节点数
	        public int size() {
	            return size(root);
	        }

	        //完整二叉树打印
	        public void fullPrint() {
	            ArrayList<String> arrayList = new ArrayList<String>();
	            if (root == null) {
	                return;
	            }
	            LinkedBlockingDeque<BinaryTreeNode> queue = new LinkedBlockingDeque<BinaryTreeNode>();
	            queue.addFirst(root);
	            while (!queue.isEmpty()) {
	                BinaryTreeNode curNode = queue.pollLast();
	                arrayList.add(curNode.getData());
	                if (curNode.getLeftChild() == null && curNode.getRightChild() == null) {
	                    continue;
	                }
	                if (curNode.getLeftChild() != null) {
	                    queue.addFirst(curNode.getLeftChild());
	                } else {
	                    queue.addFirst(new BinaryTreeNode(null));
	                }
	                if (curNode.getRightChild() != null) {
	                    queue.addFirst(curNode.getRightChild());
	                } else {
	                    queue.addFirst(new BinaryTreeNode(null));
	                }
	            }
	            System.out.println("完整二叉树打印" + arrayList);
	        }

	        //压缩打印
	        public void reducePrint() {
	            ArrayList<String> arrayList = new ArrayList<String>();
	            if (root == null) {
	                return;
	            }
	            LinkedBlockingDeque<BinaryTreeNode> queue = new LinkedBlockingDeque<BinaryTreeNode>();
	            queue.addFirst(root);
	            while (!queue.isEmpty()) {
	                BinaryTreeNode curNode = queue.pollLast();
	                arrayList.add(curNode.getData());
	                if (curNode.getLeftChild() != null) {
	                    queue.addFirst(curNode.getLeftChild());

	                }
	                if (curNode.getRightChild() != null) {
	                    queue.addFirst(curNode.getRightChild());
	                }
	            }
	            System.out.println("压缩二叉树打印" + arrayList);
	        }

	        //给某个节点插入左节点
	        public void insertLeft(BinaryTreeNode parent, BinaryTreeNode newNode) {
	            parent.setLeftChild(newNode);
	        }

	        //给某个节点插入右节点
	        public void insertRight(BinaryTreeNode parent, BinaryTreeNode newNode) {
	            parent.setRightChild(newNode);
	        }

	        //获取某个节点的左子树
	        public BinaryTreeNode getLeftTree(BinaryTreeNode node) {
	            return node.getLeftChild();
	        }

	        //获取某个节点的右子树
	        public BinaryTreeNode getRightTree(BinaryTreeNode node) {
	            return node.getRightChild();
	        }

	        //查找node节点在二叉树中的父节点
	        public BinaryTreeNode getParent(BinaryTreeNode node) {
	            return (root == null || root == node) ? null : getParent(root, node);
	        }

        //前跟遍历
	        public void PreOrder(BinaryTreeNode node) {
	            if (node != null) {
	                System.out.print(node.getData() + " "); //先访问根节点
	                PreOrder(node.getLeftChild());  //先根遍历左子树
	                PreOrder(node.getRightChild());  //先根遍历右子树
	            }
	        }

	        //中根遍历
	        public void InOrder(BinaryTreeNode node) {
	            if (node != null) {
	                InOrder(node.getLeftChild());  //中根遍历左子树
	                System.out.print(node.data + " ");    //访问根节点
	                InOrder(node.getRightChild());  //中根遍历右子树
	            }
	        }

	        //后根遍历
	        public void PostOrder(BinaryTreeNode node) {
	            if (node != null) {
	                PostOrder(node.getLeftChild());  //后根遍历左子树
	                PostOrder(node.getRightChild());  //后根遍历右子树
	                System.out.print(node.getData() + " ");   //访问根节点
	            }
	        }

	        /**
	         * 二叉树的清空:
	         * 首先提供一个清空以某个节点为根节点的子树的方法,既递归地删除每个节点;
	         * 接着提供一个删除树的方法,直接通过第一种方法删除到根节点即可
	         */
	        //清除某个子树的所有节点
	        private void clear(BinaryTreeNode node) {
	            if (node != null) {
	                clear(node.getLeftChild());
	                clear(node.getRightChild());
	                node = null; //删除节点
	            }
	        }

	        /**
	         * 求二叉树的高度:
	         * 首先要一种获取以某个节点为子树的高度的方法,使用递归调用。
	         * 如果一个节点为空,那么这个节点肯定是一颗空树,高度为0;
	         * 如果不为空,那么我们要遍历地比较它的左子树高度和右子树高度,
	         * 高的一个为这个子树的最大高度,然后加上自己本身的高度就是了
	         * 获取二叉树的高度,只需要调用第一种方法,即传入根节点
	         */
	        //获取以某节点为子树的高度
	        private int height(BinaryTreeNode node) {
	            if (node == null) {
	                return 0; //递归结束,空子树高度为0
	            } else {
	                //递归获取左子树高度
	                int l = height(node.getLeftChild());
	                //递归获取右子树高度
	                int r = height(node.getRightChild());
	                //高度应该算更高的一边,(+1是因为要算上自身这一层)
	                return l > r ? (l + 1) : (r + 1);
	            }
	        }

	        /**
	         * 求二叉树的节点数:
	         * 求节点数时,我们看看获取某个节点为子树的节点数的实现。
	         * 首先节点为空,则个数肯定为0;
	         * 如果不为空,那就算上这个节点之后继续递归所有左右子树的子节点数,
	         * 全部相加就是以所给节点为根的子树的节点数
	         * 如果求二叉树的节点数,则输入根节点即可
	         */
	        public int size(BinaryTreeNode node) {
	            if (node == null) {
	                return 0;  //如果节点为空,则返回节点数为0
	            } else {
	                //计算本节点 所以要+1
	                //递归获取左子树节点数和右子树节点数,最终相加
	                return 1 + size(node.getLeftChild()) + size(node.getRightChild());
	            }
	        }


	        /**
	         * 判断两树是否相等:
	         */
	        public boolean isEqual(BinaryTree T1) {
	            if (T1 == null && root == null) {
	                return true;
	            }
	            if (T1 != null && root != null)
	                if (T1.getRoot().getData().equals(root.getData()))
	                    if (isEqual(T1.getRoot().leftChild, root.leftChild))
	                        if (isEqual(T1.getRoot().rightChild, root.rightChild))
	                            return true;

	            return true;
	        }

	        private boolean isEqual(BinaryTreeNode T1, BinaryTreeNode T2) {
	            if (T1 == null && T2 == null) {
	                return true;
	            }
	            if (T1 != null && root != null)
	                if (T1.getData().equals(root.getData()))
	                    if (isEqual(T1.leftChild, T2.leftChild))
	                        if (isEqual(T1.rightChild, T2.rightChild))
	                            return true;
	            return true;
	        }


	        //node节点在subTree子树中的父节点
	        private BinaryTreeNode getParent(BinaryTreeNode subTree, BinaryTreeNode node) {
	            if (subTree == null) {
	                return null;   //如果是空子树,则没有父节点
	            }
	            if (subTree.getLeftChild() == node || subTree.getRightChild() == node) {
	                return subTree;   //如果子树的根节点的左右孩子之一是待查节点,则返回子树的根节点
	            }
	            BinaryTreeNode parent = null;
	            if (getParent(subTree.getLeftChild(), node) != null) {
	                parent = getParent(subTree.getLeftChild(), node);
	                return parent;
	            } else {
	                //递归左右子树
	                return getParent(subTree.getRightChild(), node);
	            }
	        }
	    }

	    public static void main(String[] args) {

	        //二叉树
	        BinaryTree tree = new BinaryTree();
	        BinaryTree treeplus = new BinaryTree();

	        //创建节点
	        BinaryTreeNode a = new BinaryTreeNode("a");
	        BinaryTreeNode b = new BinaryTreeNode("b");
	        BinaryTreeNode c = new BinaryTreeNode("c");
	        BinaryTreeNode d = new BinaryTreeNode("d");
	        BinaryTreeNode e = new BinaryTreeNode("e");
	        BinaryTreeNode f = new BinaryTreeNode("f");
	        BinaryTreeNode g = new BinaryTreeNode("g");
	        BinaryTreeNode h = new BinaryTreeNode("h");

	        //构建二叉树
	        tree.setRoot(a);
	        a.setLeftChild(b);
	        a.setRightChild(c);
	        b.setLeftChild(d);
	        c.setLeftChild(e);
	        c.setRightChild(f);
	        e.setLeftChild(h);
	        d.setLeftChild(g);
	        
	        /**
	         *         a
	         *        / \
	         *       b   c
	         *      /    /\
	         *     d    e  f
	         *    /    /
	         *   g    h
	         */

	        //第二个二叉树
	        treeplus.setRoot(a);
	        a.setLeftChild(b);
	        b.setLeftChild(c);
	        b.setRightChild(d);
	        c.setLeftChild(e);
	        c.setRightChild(f);
	        e.setLeftChild(h);
	        d.setLeftChild(g);
	        
	        /**
	         *         a
	         *        / 
	         *       b
	         *      / \
	         *     c   d
	         *    / \ 
	         *   e   f
	         *  /   /
	         * h   g
	         */

	        //前序遍历
	        tree.PreOrder(tree.getRoot());

	        System.out.println(" ");
	        //中根遍历
	        tree.InOrder(tree.getRoot());

	        System.out.println(" ");
	        //后序遍历
	        tree.PostOrder(tree.getRoot());

	        System.out.println(" ");

	        tree.size(a);
	        //完整二叉树打印
	        tree.fullPrint();

	        //二叉树个数
	        System.out.println("二叉树个数:" + tree.size());

	        //二叉树高度
	        System.out.println("二叉树高度:" + tree.height());

	        //查找二叉树
	        BinaryTreeNode result = tree.searchNode("g");
	        System.out.println("查询结果:" + result);//返回节点的地址
	        result = tree.searchNode("z");
	        System.out.println("查询结果:" + result);

	        //判断两棵树是否相等
	        System.out.println("两棵树是否相等" + tree.isEqual(treeplus));
	    }

	}


运行结果如下:
Java二叉树的实现(含各种方法)
喜欢我的话请一键三连噢宝贝们~