博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【数据结构】-----二叉树
阅读量:4971 次
发布时间:2019-06-12

本文共 4743 字,大约阅读时间需要 15 分钟。

1、二叉树的定义:

    二叉树是每个节点最多有两个子树的树结构。

   特别地:

    ①除了最后一层节点外,其他节点的数目都达到了所在层的最大值,称为完全二叉树。同时,最后一层的所有节点必须从最后一层的左边开始。而不是说左边一个,右边一个,中间一个。(运用 : 二叉堆)

    除最后一层外,每一层上的所有结点都有两个子结点。这样的二叉树称为满二叉树。在满二叉树中,每一层上的结点数都达到最大值,即在满二叉树的第k层上有2k-1个结点,且深度为m的满二叉树有2m-1个结点。(中外定义有所不同)

 

2、实现二叉树:

    ①定义一个节点类Node:

public class Node {    int value;    Node leftChild;    Node rightChild;        public Node(int value) {        // TODO Auto-generated constructor stub        this.value = value;    }        public void display() {        System.out.println(this.value);    }        @Override    public String toString() {        // TODO Auto-generated method stub        return String.valueOf(this.value);    }}

    ②实现基本的二叉树操作:

public class BinaryTree {    Node root = null;        public BinaryTree(int rootValue) {        // TODO Auto-generated constructor stub        root = new Node(rootValue);        root.leftChild = null;        root.rightChild = null;    }    public Node findKey(int value) {}   //查找        public String insert(int value) {}  //插入        public void inOrderTraverse() {}    //中序遍历递归操作        public void inOrderByStack() {}     //中序遍历非递归操作        public void preOrderTraverse() {}  //前序遍历        public void preOrderByStack() {}   //前序遍历非递归操作        public void postOrderTraverse() {} //后序遍历        public void postOrderByStack() {}  //后序遍历非递归操作        public int getMinValue() {} //得到最小(大)值        public boolean delete(int value) {} //删除    }

    ③查找操作:

public Node findKey(int value) {        Node current = root;        while(true) {            if(value == current.value)                return current;            else if(value < current.value)                current = current.leftChild;            else // vale > current.value                current = current.rightChild;                        if(current == null)                return null;        }    }   //查找

    ④插入操作

public void insert(int value) {        /**         * 核心思想:         *   1、如果不存在节点,则直接插入。         *   2、从根开始查找一个节点,即新节点的父节点,当父节点找到后,根据节点的值来确定插入左节点还是右节点。         */        Node node = new Node(value);                if(root == null) {            root = node;            root.leftChild = null;            root.rightChild = null;        }        else {            Node current = root;            while(true) {                if(value < current.value) {                    current = current.leftChild;                    if(current == null) {                        current = node;                        break;                    }                }                                else if(value > current.value) {                    current = current.rightChild;                    if(current == null) {                        current = node;                        break;                    }                }                                else {                    System.out.println("having value in this BinaryTree");                    break;                }            }        }    }  //插入

    ⑤中序遍历:

public void inOrderTraverse() {          /**         * //中序遍历(递归):         *    1、调用自身来遍历节点的左子树         *    2、访问这个节点         *    3、调用自身来遍历节点的右子树         */        System.out.print("中序遍历:");        inOrderTraverse(root);        System.out.println();    }    //中序遍历递归操作        private void inOrderTraverse(Node node) {        if(node == null)            return;        inOrderTraverse(node.leftChild);        node.display();        inOrderTraverse(node.rightChild);    }

 

    ⑥前序遍历:

public void preOrderTraverse() {          /**         * //前序遍历(递归):         *    1、访问这个节点         *    2、调用自身来遍历节点的左子树         *    3、调用自身来遍历节点的右子树         */        System.out.println("前序遍历:");        preOrderTraverse(root);        System.out.println();    }  //前序遍历        private void preOrderTraverse(Node node) {        if(node == null)            return;        node.display();        preOrderTraverse(node.leftChild);        preOrderTraverse(node.rightChild);    }

    ⑦后序遍历:

public void postOrderTraverse() {          /**         * //后序遍历(递归):         *    1、调用自身来遍历节点的左子树         *    2、调用自身来遍历节点的右子树         *    3、访问这个节点         */        System.out.println("后序遍历:");        postOrderTraverse(root);        System.out.println();    } //后序遍历        private void postOrderTraverse(Node node) {        if(node == null)            return;        postOrderTraverse(node.leftChild);        postOrderTraverse(node.rightChild);        node.display();    }

    ⑧得到最小值

public int getMinValue() {        Node current = root;        while(true) {            if(current.leftChild == null)                return current.value;            else                current = current.leftChild;        }    } //得到最小(大)值

    ⑨删除操作

    后补...

 

转载于:https://www.cnblogs.com/jizhidexiaobai/p/8398497.html

你可能感兴趣的文章
02号团队-团队任务3:每日立会(2018-12-05)
查看>>
SQLite移植手记1
查看>>
js05-DOM对象二
查看>>
mariadb BINLOG_FORMAT = STATEMENT 异常
查看>>
C3P0 WARN: Establishing SSL connection without server's identity verification is not recommended
查看>>
iPhone在日本最牛,在中国输得最慘
查看>>
动态方法决议 和 消息转发
查看>>
C#生成随机数
查看>>
Java回顾之多线程
查看>>
机电行业如何进行信息化建设
查看>>
9、总线
查看>>
2018 Multi-University Training Contest 10 - Count
查看>>
HDU6203 ping ping ping
查看>>
构建之法阅读笔记02
查看>>
DataTable和 DataRow的 区别与联系
查看>>
检索COM 类工厂中CLSID 为 {00024500-0000-0000-C000-000000000046}的组件时失败
查看>>
mysql数据库中数据类型
查看>>
Fireworks基本使用
查看>>
Linux 标准 I/O 库
查看>>
.net Tuple特性
查看>>