• 数据结构之树


    树是一种递归结构!

    具有n个节点的数据集。

    常见由二叉树,二叉查找树,红黑树,B+tree,B-tree等。

    下面通过一段代码来实现简单的二叉树:

    首先二叉树:

    每个节点至多由两个子树。i层的节点总数不大于2^i-1。度为2就指的是子树为2.

    层数和深度是指树的下延数。

    二叉树又分为完全二叉树(除了最后一层其它各层的子树都满)和满二叉树(与完全二叉树不同在于所有层数都是满的达到了此树的度)。

    //定义二叉树对象

    public class BinaryTree {
    private TreeNode root;// 根节点

    public BinaryTree() {
    // TODO Auto-generated constructor stub
    }

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

    public TreeNode getRoot() {
    return root;
    }

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

    /*
    * 定义节点内部类
    */
    private static class TreeNode {
    // 数据部分
    private String data = null;
    // 左节点的引用
    private TreeNode left;
    // 右节点的引用
    private TreeNode right;

    public TreeNode() {
    // TODO Auto-generated constructor stub
    }

    //含参构造

    public TreeNode(String data, TreeNode left, TreeNode right) {
    super();
    this.data = data;
    this.left = left;
    this.right = right;
    }

    public String getData() {
    return data;
    }

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

    public TreeNode getLeft() {
    return left;
    }

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

    public TreeNode getRight() {
    return right;
    }

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

    /**
    * 返回父节点
    *
    * @param element
    * @return
    */
    public TreeNode GetParent(TreeNode element) {
    return (root==null||root==element)
    ?null:parent(root,element);
    }

    public TreeNode parent(TreeNode subTree, TreeNode element) {
    if (subTree==null) return null;
    if (subTree.getLeft()==element||subTree.getRight()==element)
    //返回父节点地址
    return subTree;
    TreeNode p;
    //现在左子树中找,如果左子树中没有找到,才到右子树去找
    if ((p=parent(subTree.getLeft(), element))!=null)
    //递归在左子树中搜索
    return p;
    else
    //递归在右子树中搜索
    return parent(subTree.getRight(), element);
    }
    /**
    * 节点个数
    * @return*/
    public int getSize(){
    return getNum(root);
    }

    private int getNum(TreeNode node) {
    if (node==null)
    {
    return 0;
    }
    else
    {
    int i=getNum(node.getLeft());
    int j=getNum(node.getRight());
    return j+i+1;
    }
    }
    /**
    * 获取树的高度
    * @return*/
    public int getHeight()
    {
    return getHeight(root);
    }

    private int getHeight(TreeNode node)
    {
    if (node==null)
    return 0;
    else
    {
    int i=getHeight(node.getLeft());
    int j=getHeight(node.getRight());
    return (i<j)?(j+1):(i+1);
    }
    }
    /**
    * 前序遍历
    *
    * @param node*/
    public void preOrder(TreeNode node)
    {
    if (node!=null) {
    System.out.println(node.getData());
    preOrder(node.getLeft());
    preOrder(node.getRight());
    }
    }
    /**
    * 中序遍历
    *
    * @param node*/
    public void inOrder(TreeNode node)
    {
    if (node!=null) {
    inOrder(node.getLeft());
    System.out.println(node.getData());
    inOrder(node.getRight());
    }
    }
    /**
    * 后序遍历
    *
    * @param node*/
    public void postOrder(TreeNode node)
    {
    if (node!=null) {
    postOrder(node.getLeft());
    postOrder(node.getRight());
    System.out.println(node.getData());
    }
    }
    /**
    * 插入操作
    * @param String value*/
    public void insert(String value){
    TreeNode newNode = new TreeNode(value,null,null);
    if (root==null) {
    root=newNode;
    root.setLeft(null);
    root.setRight(null);
    }else{
    TreeNode currentNode=root;
    TreeNode parentNode;
    while (true) {
    parentNode=currentNode;
    //放右子树节点
    if (currentNode==null) {
    currentNode.data=value;
    currentNode.left=null;
    currentNode.right=null;
    return;
    }
    if (currentNode.getLeft()==null) {
    currentNode=currentNode.left;
    }else if (currentNode.getRight()==null) {
    currentNode=currentNode.right;
    }else {
    if (getHeight(root.right)>getHeight(root.left)) {

    }
    }
    }
    }

    }
    public static void main(String[] args) {
    TreeNode l12 = new TreeNode("left12", null, null);
    TreeNode r12 = new TreeNode("right12", null, null);
    TreeNode l22 = new TreeNode("left22", null, null);
    TreeNode r22 = new TreeNode("right22", null, null);

    TreeNode l1 = new TreeNode("left1",l12,r12);//根节点左子树
    TreeNode r1 = new TreeNode("right1",l22,r22);//根节点右子树
    //创建根节点
    TreeNode root = new TreeNode("root",l1,r1);

    BinaryTree bt = new BinaryTree(root);
    System.out.println("======先序遍历======");
    bt.preOrder(bt.getRoot());
    System.out.println("======中序遍历======");
    bt.inOrder(bt.getRoot());
    System.out.println("======后序遍历======");
    bt.postOrder(bt.getRoot());
    System.out.println("===========");
    System.out.println(bt.getHeight());
    System.out.println(bt.getSize());


    System.out.println(bt.GetParent(r22).getData());
    }
    }

    //理解的还是不够深入,对于一些具体细节还是由疑问???

  • 相关阅读:
    银行卡号每隔四位添加一个分隔符
    clipboard.js实现文本复制
    选中|复制文本
    react---之下拉菜单默认选中的值始终不变的问题
    create-react-app支持less配置
    数对
    安置路灯
    被三整除
    牛牛找工作
    C++ std::pair
  • 原文地址:https://www.cnblogs.com/plas/p/9963738.html
Copyright © 2020-2023  润新知