二叉树的简单实现--数据结构与算法纪录片第二记

  这几天状态不好看不下去,所以停了一下。今天把二叉树的实现写了一下,把其中的原理也重新理解了一遍。

package tree.bstree;

/** * @Description: TODO * @Auther: Zhang * @Date: 2018/11/5 16:34 */public class BSTNode<T extends Comparable<T>> {    private T key;    private BSTNode<T> parentNode;    private BSTNode<T> leftChildrenNode;    private BSTNode<T> rightChildrenNode;

public BSTNode(T key) {        this.key = key;        parentNode = leftChildrenNode = rightChildrenNode = null;    }

public BSTNode(T key, BSTNode<T> parentNode, BSTNode<T> leftChildrenNode, BSTNode<T> rightChildrenNode) {        this.key = key;        this.parentNode = parentNode;        this.leftChildrenNode = leftChildrenNode;        this.rightChildrenNode = rightChildrenNode;    }

public T getKey() {        return key;    }

public void setKey(T key) {        this.key = key;    }

public BSTNode<T> getParentNode() {        return parentNode;    }

public void setParentNode(BSTNode<T> parentNode) {        this.parentNode = parentNode;    }

public BSTNode<T> getLeftChildrenNode() {        return leftChildrenNode;    }

public void setLeftChildrenNode(BSTNode<T> leftChildrenNode) {        this.leftChildrenNode = leftChildrenNode;    }

public BSTNode<T> getRightChildrenNode() {        return rightChildrenNode;    }

public void setRightChildrenNode(BSTNode<T> rightChildrenNode) {        this.rightChildrenNode = rightChildrenNode;    }}
package tree.bstree;

/** * @Description: TODO * @Auther: Zhang * @Date: 2018/11/5 16:33 */public class BSTree<T extends Comparable<T>> {

private BSTNode<T> rootNode;

public BSTree() {        rootNode = null;    }

public BSTree(BSTNode<T> node) {        rootNode = node;    }

//查找最大节点    private BSTNode<T> maxNode(BSTNode<T> bstNode) {        if (bstNode == null) {            return bstNode;        }        while (bstNode.getRightChildrenNode() != null) {            bstNode = bstNode.getRightChildrenNode();        }        return bstNode;    }

public BSTNode<T> maxNode() {        return this.maxNode(rootNode);    }

//查找最小节点    private BSTNode<T> minNode(BSTNode bstNode) {        if (bstNode == null) {            return bstNode;        }        while (bstNode.getLeftChildrenNode() != null) {            bstNode = bstNode.getLeftChildrenNode();        }        return bstNode;    }

public BSTNode<T> minNode() {        return this.minNode(rootNode);    }

//插入节点    private void insert(BSTNode<T> bstNode) {        int compareResult;        BSTNode<T> parent = null;        BSTNode<T> current = rootNode;

//如果树为空,该节点为根节点        if (rootNode == null) {            rootNode = bstNode;            return;        }

//数不为空,判断节点的位置        while (current != null) {            parent = current;            compareResult = bstNode.getKey().compareTo(current.getKey());            if (compareResult == 0) {                System.out.println("该节点已存在树中");                return;            }            if (compareResult < 0) {                current = current.getLeftChildrenNode();            } else {                current = current.getRightChildrenNode();            }        }

//将节点插入到树中        bstNode.setParentNode(parent);        compareResult = bstNode.getKey().compareTo(parent.getKey());        if (compareResult < 0) {            parent.setLeftChildrenNode(bstNode);        } else {            parent.setRightChildrenNode(bstNode);        }    }

public void insert(T key) {        BSTNode<T> bstNode = new BSTNode<>(key);        this.insert(bstNode);    }

//删除节点    private void delete(T key, BSTree<T> bsTree) {        BSTNode<T> bstNode = this.find(key);        if (bstNode == null) {            System.out.println("没有找到该节点");        }        BSTNode<T> parent = bstNode.getParentNode();        int comp = bstNode.getKey().compareTo(parent.getKey());        //如果节点没有孩子节点        if (bstNode.getLeftChildrenNode() == null && bstNode.getRightChildrenNode() == null) {            if (comp > 0) {                parent.setRightChildrenNode(null);            } else {                parent.setLeftChildrenNode(null);            }            return;        }

//如果该节点只有左子树或者该节点只有右子树        //只有左子树        if (bstNode.getLeftChildrenNode() != null && bstNode.getRightChildrenNode() == null) {            if (comp > 0) {                parent.setRightChildrenNode(bstNode.getLeftChildrenNode());            } else {                parent.setLeftChildrenNode(bstNode.getLeftChildrenNode());            }            return;        }

//只有右子树        if (bstNode.getRightChildrenNode() != null && bstNode.getLeftChildrenNode() == null) {            if (comp > 0) {                parent.setRightChildrenNode(bstNode.getRightChildrenNode());            } else {                parent.setLeftChildrenNode(bstNode.getRightChildrenNode());            }            return;        }

//既有左子树又有右子树        if (bstNode.getLeftChildrenNode() != null && bstNode.getRightChildrenNode() != null) {            BSTNode<T> newNode = minNode(bstNode.getRightChildrenNode());            if (bstNode.getRightChildrenNode() == newNode) {                newNode.setRightChildrenNode(null);            } else {                parent.setRightChildrenNode(newNode);                newNode.setLeftChildrenNode(bstNode.getLeftChildrenNode());                newNode.setRightChildrenNode(bstNode.getRightChildrenNode());            }            if (comp > 0) {                parent.setRightChildrenNode(newNode);            } else {                parent.setLeftChildrenNode(newNode);            }        }    }

public void delete(T key) {        delete(key, this);    }

//查找节点    private BSTNode<T> find(T key, BSTree<T> bsTree) {        int comp;        BSTNode<T> current = bsTree.rootNode;        comp = key.compareTo(current.getKey());        while (comp != 0) {            if (comp > 0) {                current = current.getRightChildrenNode();            } else {                current = current.getLeftChildrenNode();            }            if (current == null) {                return current;            }            comp = key.compareTo(current.getKey());        }        return current;    }

public BSTNode<T> find(T key) {        BSTNode bstNode = this.find(key, this);        if (bstNode == null) {            System.out.println("没有找到该节点");        }        return bstNode;    }

//前序遍历    private void preOrder(BSTNode<T> bstNode) {        if (bstNode != null) {            System.out.println("key is : " + bstNode.getKey());            preOrder(bstNode.getLeftChildrenNode());            preOrder(bstNode.getRightChildrenNode());        } else {            return;        }

}

public void preOrder() {        System.out.println("前序遍历: ");        this.preOrder(rootNode);    }

//中序遍历    private void midOrder(BSTNode<T> bstNode) {        if (bstNode != null) {            midOrder(bstNode.getLeftChildrenNode());            System.out.println("key is : " + bstNode.getKey());            midOrder(bstNode.getRightChildrenNode());        } else {            return;        }    }

public void midOrder() {        System.out.println("中序遍历: ");        this.midOrder(rootNode);    }

//后序遍历    private void postOrder(BSTNode<T> bstNode) {        if (bstNode != null) {            postOrder(bstNode.getLeftChildrenNode());            postOrder(bstNode.getRightChildrenNode());            System.out.println("key is : " + bstNode.getKey());        } else {            return;        }    }

public void postOrder() {        System.out.println("后序遍历: ");        this.postOrder(rootNode);    }

//前驱节点    private BSTNode<T> predecessor(BSTNode<T> bstNode) {        //如果存在左孩子,则前驱为最大左孩子        if (bstNode.getLeftChildrenNode() != null) {            return maxNode(bstNode.getLeftChildrenNode());        }        //不存在左孩子:如果该节点是其父节点的右孩子,则前驱节点为该节点的父节点        //不存在左孩子:如果该节点是其父节点的左孩子,则往上查找最低父节点,该节点必须是其父节点的左孩子        BSTNode<T> parent = bstNode.getParentNode();        while (parent != null && parent.getLeftChildrenNode() == bstNode) {            bstNode = parent;            parent = bstNode.getParentNode();        }        return parent;    }

public BSTNode<T> predecessor(T key) {        BSTNode<T> bstNode = this.find(key);        if (bstNode == null) {            return null;        }else {            return predecessor(bstNode);        }    }

//后继节点    private BSTNode<T> successor(BSTNode<T> bstNode) {        //如果存在右孩子,则为右子树中的最小值        if (bstNode.getRightChildrenNode() != null) {            return minNode(bstNode.getRightChildrenNode());        }

//不存在右孩子:该节点为父节点的右节点,则后继节点为父节点        //不存在右孩子:该节点为父节点的左节点,则往上查找最低的父节点且该节点为父节点的左节点        BSTNode<T> parent = bstNode.getParentNode();        while (parent != null && parent.getRightChildrenNode() == bstNode) {            bstNode = parent;            parent = bstNode.getParentNode();        }        return parent;    }

public BSTNode<T> successor(T key) {        BSTNode<T> node;        BSTNode<T> bstNode = find(key);        if (bstNode == null) {            return null;        }else {            return successor(bstNode);        }    }

}
package tree.bstree;

/** * @Description: TODO * @Auther: Zhang * @Date: 2018/11/5 18:15 */public class MainTest {    public static void main(String[] args) {        BSTNode<Integer> bstNode = new BSTNode<>(5);        BSTree<Integer> bsTree = new BSTree<>(bstNode);        bsTree.insert(4);        bsTree.insert(2);        bsTree.insert(9);        bsTree.find(222);        bsTree.insert(3);        bsTree.delete(2);        bsTree.insert(33);        bsTree.insert(2);        bsTree.preOrder();        bsTree.midOrder();        bsTree.postOrder();        if (bsTree.predecessor(32)!=null){            System.out.println(bsTree.predecessor(32).getKey());        }        System.out.println(bsTree.predecessor(33).getKey());        System.out.println(bsTree.successor(3).getKey());

}}

原文地址:https://www.cnblogs.com/qugemingzihaonan13/p/9914351.html

时间: 2024-10-29 08:12:25

二叉树的简单实现--数据结构与算法纪录片第二记的相关文章

栈表简单实现--数据结构与算法纪录片第二记

栈的实现: package linear.stack; import java.lang.reflect.Array; /** * @Description: 栈的实现 * @Auther: Weijie.Zhang * @Date: 2018/11/2 16:56 */public class Stack<T> { private final static int DEFAULT_SIZE = 10; private T[] array; private int count; public

双向链表简单实现--数据结构与算法纪录片第一记

从这个月开始得准备春招的东西,所以打算重新学习数据结构与算法,以后的博客就以这个为主. 今天是线性结构中的双向链表. 代码实现与测试: DoubleLinkNode: package linear.doublelink; /** * @Description: 链表节点结构体 * @Auther: Weijie.Zhang * @Date: 2018/11/1 17:03 */public class DoubleLinkNode<T> { public T value; public Dou

javascript数据结构和算法 零(前记+序言)

前记 这本书Data Structure and Algorithm with Javascript 我将其翻译成<< javascript 数据结构和算法>> 为什么这么翻译?而不是翻译成"用javascript实现数据结构和算法" 原因有二: 一个,我觉的它更加简洁,第二个,我是想强调我们在这里使用的是javascript. 我不喜欢一些翻译的人把一个简单的语句进行加工,搞得晦涩难懂.我更喜欢外国人写书的 那种原汁原味.同样,我很喜欢外国人的那种分享精神,它

Java数据结构与算法(第二章数组)

数组是应用最广泛的数据存储结构.它被植入到大部分编程语言中. Java中数组的基础知识     创建数组 在Java中把它们当作对象来对待,因此在创建数组是必须使用new操作符:     int[] intArray;            //defines a reference to an array     ingArray = new int[100];    //creates the array, and                                  //set

HDFS简单的shell操作--大数据纪录片第二记

一.基本语法: bin/hadoop fs -具体命令 二.部分简单命令操作 1.显示命令的参数: help ls 2.显示该目录下所有文件: ls 目录 3.在hdfs上创建目录: mkdir 目录 4.从本地剪切到hdfs上: moveFromLocal 本地位置 hdfs上位置 5.追加一个文件A到已存在文件B末尾: appendToFile A B 6.显示文件内容: cat 文件 7.显示文件末尾: tail 文件所在位置 其实hdfs上的shell命令和linux下差不多,不继续列举

《数据结构与算法》第二章 线性表

线性表 定义: 由n个特性相同 数据元素(即可有很多数据项)构成的有限序列,同时相邻数据元素之间存在 序偶 关系. 线性表中元素个数就是 表长 . 特点: ·存在唯一一个被称为 “第一个” 的数据元素(线性起点.起始结点): ·存在唯一一个被称为 “最后一个” 的数据元素(线性终点.终端结点): ·除第一个以外,结构中的每个数据元素均 只有一个前驱 : ·除最后一个外,结构中的每个数据元素均 只有一个后继 . 顺序表示和实现 线性表的顺序表示指的是用一组地址连续的存储单元一次存储线性表的数据元素

程序员书单_数据结构和算法篇

大话数据结构 程杰 著 http://download.csdn.net/detail/shenzhq1980/9145645Java数据结构和算法.(第二版) http://download.csdn.net/detail/shenzhq1980/9145633

数据结构与算法系列研究五——树、二叉树、三叉树、平衡排序二叉树AVL

树.二叉树.三叉树.平衡排序二叉树AVL 一.树的定义 树是计算机算法最重要的非线性结构.树中每个数据元素至多有一个直接前驱,但可以有多个直接后继.树是一种以分支关系定义的层次结构.    a.树是n(≥0)结点组成的有限集合.{N.沃恩}     (树是n(n≥1)个结点组成的有限集合.{D.E.Knuth})      在任意一棵非空树中:        ⑴有且仅有一个没有前驱的结点----根(root).        ⑵当n>1时,其余结点有且仅有一个直接前驱.         ⑶所有结

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设