java实现二叉树及遍历、删除

java实现二叉树及遍历、删除

个人网站:多猫影视【可以看各大网站的VIP视频】www.duomao.xyz

二叉树是递归定义的,其结点有左右子树之分,逻辑上二叉树有五种基本形态:

(1)空二叉树——如图(a);

(2)只有一个根结点的二叉树——如图(b);

(3)只有左子树——如图(c);

(4)只有右子树——如图(d);

(5)完全二叉树——如图(e)。

注意:尽管二叉树与树有许多相似之处,但二叉树不是树的特殊情形。[1]

类型

(1)完全二叉树——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树

(2)满二叉树——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

(3)平衡二叉树——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

代码注释的比较详细,就不用再说明了。

package com.niu.test;

/**
 * Created by Administrator on 2017/9/26.
 */
public class AlvinTree {

    private Node root;

    //1、创建二叉树的结点(三个要素:结点数据,左结点,右结点)
    private class Node {
        //层序
        private int key;
        //结点中存储的数据
        private Object data;
        //左右子树
        private Node leftNode;
        private Node rightNode;
        private boolean isVisted = false;

        //空的构造方法
        public Node() {
        }

        public Node(int key, Object data) {
            this.data = data;
            this.key = key;
            this.leftNode = null;
            this.rightNode = null;
        }
    }

    //2、创建根节点(构造函数)
    public AlvinTree() {
        root = new Node(1, "A");
    }

    //3、创建一棵树
    public void creatTree(Node root) {
        Node nodeb = new Node(2, "B");
        Node nodec = new Node(3, "C");
        Node noded = new Node(4, "D");
        Node nodee = new Node(5, "E");
        Node nodef = new Node(6, "F");
        Node nodeg = new Node(7, "G");
        root.leftNode = nodeb;
        root.rightNode = nodec;
        root.leftNode.leftNode = noded;
        root.leftNode.rightNode = nodee;
        nodec.leftNode = nodef;
        nodef.rightNode = nodeg;
       /*           A
            B               C
        D       E       F
                      G
       树的结构图
        */
    }

    //4、树的高度(利用递归思想)
    public int height() {
        return height(root);
    }

    public int height(Node node) {
        //空树高度为0
        if (node == null) {
            return 0;
        } else {
            //左右子树的高度
            int l = height(node.leftNode);
            int r = height(node.rightNode);
            //三元运算符,哪边的树高为哪边
            return l < r ? (r + 1) : (l + 1);
        }
    }

    //5、结点的数量
    public int size() {
        return size(root);
    }

    public int size(Node node) {
        if (node == null) {
            return 0;
        } else {
            //利用递归的思想,只要存在子节点就加1
            return 1 + size(node.leftNode) + size(node.rightNode);
        }
    }

    //6、查找双亲结点(如果A结点是B结点的子节点,则B是A的双亲)
    public Node parent(Node node) {
        return (node == null || root == node) ? null : parent(root, node);
    }

    /*
    按照从上往下,先左子树后右子树的方法去从root结点向下寻找双亲结点
    up:上级结点,index要查找的结点
    如果找到了双亲就返回双亲结点,否则返回null
     */
    public Node parent(Node up, Node index) {
        //老规矩,先判断是否为空
        if (up == null) {
            return null;
        }
        //如果上级结点up是双亲,则返回up
        if (up.leftNode == index || up.rightNode == index) {
            return up;
        }
        //否则先查找左子节点,后右子节点
        Node parent;
        if ((parent = parent(up.leftNode, index)) != null) {
            return parent;
        } else {
            return parent(up.rightNode, index);
        }

    }

    //7、返回左孩子
    public Node getLeftChild(Node node) {
        return (node.leftNode != null) ? node.leftNode : null;
    }

    //8、返回右孩子
    public Node getRightChild(Node node) {
        return (node.rightNode != null) ? node.rightNode : null;
    }

    //9、返回根节点
    public Node getRoot() {
        return root;
    }

    //10、删除某个结点(删除结点需要保证其下的子结点全部删除
    public void delete(Node node) {
        if (node != null) {
            delete(node.leftNode);
            delete(node.rightNode);
            node = null;
        }
    }

    public void visit(Node node){
        node.isVisted=true;
        System.out.println("结点"+node.key+"信息:"+node.data);
    }

    //11、前序遍历:根节点,左结点,右结点
    public void preorder(Node node){
        if(node!=null){
            visit(node);
            preorder(node.leftNode);
            preorder(node.rightNode);
        }
    }
    //12、中序遍历:左根右
    public void inorder(Node node){
        if (node!=null){
            inorder(node.leftNode);
            visit(node);
            inorder(node.rightNode);
        }
    }
    //13、后续遍历
    public void postorder(Node node){

        if(node!=null){
            postorder(node.leftNode);
            postorder(node.rightNode);
            visit(node);
        }
    }

    public static void main(String[] args) {
        AlvinTree alvinTree=new AlvinTree();
        alvinTree.creatTree(alvinTree.root);
        System.out.println("size:"+alvinTree.size());
        System.out.println("height:"+alvinTree.height());

    }
}
时间: 2024-11-09 21:17:56

java实现二叉树及遍历、删除的相关文章

java实现二叉树层次遍历

public class BSTNode<T extends Comparable<T>> { T key; // 关键字(键值) BSTNode<T> left; // 左孩子 BSTNode<T> right; // 右孩子 BSTNode<T> parent; // 父结点 public BSTNode(T key, BSTNode<T> parent, BSTNode<T> left, BSTNode<T&g

用java实现二叉树的遍历算法

用java实现二叉树的遍历算法用java实现二叉树的遍历算法,编写二叉树类BinaryTree代码如下:package package2; public class BinaryTree { int data; //根节点数据BinaryTree left; //左子树BinaryTree right; //右子树 public BinaryTree(int data) //实例化二叉树类{this.data = data;left = null;right = null;} public vo

java生成二叉树和遍历

在java中实现二叉树和链表的方法都是在类中定义该类的对象引用 比如 class Tree { int data; Tree left; Tree right; } 这样的话当我们new一个Tree对象的时候,该对象就拥有了left和right两个对象,这样就起到了连接的 作用,在链表中就是连接了下一个,在树中就相当于边,这样就起到一个接一个的效果.总之,就是吧对象连接起来了. 下面是完整代码 package code; public class TwoTree { public static

Java数据结构-二叉树及其遍历

二叉树的定义:n(n>=0)个结点的有限集合,该集合或者为空集(称为空二叉树),或者由一个根结点和两棵互相不相交的.分别称为根结点的左子树和右子树的二叉树组成. 二叉树的特点: 0<=度<=2: 左右子树是有顺序的,不能颠倒: 不论有几棵子树,也要区分它是左子树还是右子树. 二叉树的五种基本形态: 空二叉树: 只有一个根结点: 根结点只有左子树: 根结点只有右子树: 根结点既有左子树又有右子树. 举例3个结点的二叉树的形态有: 下面说一些特殊的二叉树. 斜树:所有的结点都只有左子树的二叉

Java实现二叉树地遍历、求深度和叶子结点的个数

一.分析 二叉树是n个结点所构成的集合,它或为空树,或为非空树.对于非空树,它有且仅有一个根结点,且除根结点以外的其余结点分为两个互不相交的子集,分别称为左子树和右子树,它们本身又都是二叉树. 显而易见,二叉树具有递归的性质,因此表示二叉树的结点至少要包含3个域:数据域.左指针.右指针.在Java中,我们可以将二叉树的结点视为一个类,其中含有左子树地址.右子树地址和数据三个属性,每个结点即使类的实例化对象.因为二叉树的递归性质,所以我们可以通过递归来实现二叉树地求深度.求叶子结点的个数.先序.中

腾讯大牛教你如何使用Java实现二叉树的添加,删除,获取以及遍历

一段来自百度百科的对二叉树的解释: 在计算机科学中,二叉树是每个结点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查找树和二叉堆. 一棵深度为k,且有2^k-1个节点的二叉树,称为满二叉树.这种树的特点是每一层上的节点数都是最大节点数.而在一棵二叉树中,除最后一层外,若其余层都是满的,并且最后一层或者是满的,或者是在右边缺少连续若干节点,则此二叉树为完全二叉树.具有n个节

Java实现二叉树的构建与遍历

转载:http://ocaicai.iteye.com/blog/1047397 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 Java代码   package tree; import java.util.LinkedList; import java.util.List; /** * 功能:把一个数组的值存入二叉树中,然后进行3种方式的遍历 * * 参考资料0:数据结构(C语言版)严蔚敏 * * 参考资料1:http://zhidao.baidu.

【LeetCode-面试算法经典-Java实现】【107-Binary Tree Level Order Traversal II(二叉树层序遍历II)】

[107-Binary Tree Level Order Traversal II(二叉树层序遍历II)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a binary tree, return the bottom-up level order traversal of its nodes' values. (ie, from left to right, level by level from leaf to root). For example

java实现二叉树的构建以及3种遍历方法

转载自http://ocaicai.iteye.com/blog/1047397 大二下学期学习数据结构的时候用C介绍过二叉树,但是当时热衷于java就没有怎么鸟二叉树,但是对二叉树的构建及遍历一直耿耿于怀,今天又遇见这个问题了,所以花了一下午的时间来编写代码以及介绍思路的文档生成! 目录: 1.把一个数组的值赋值给一颗二叉树 2.具体代码 1.树的构建方法 2.具体代码 Java代码   package tree; import java.util.LinkedList; import jav