56.【树型结构】(一)

简介: 56.【树型结构】

(一)、树型结构

1.树的定义:

树是一种数据结构,它是由n(n≥0)个有限结点组成一个具有层次关系的集合。把它叫做“树”是因为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的。它具有以下的特点:

每个结点有零个或多个子结点(n>=0)没有父结点的结点称为根节点;每一个非根结点有且只有一个父结点;除了根结点外,每个子结点可以分为多个不相交的子树。(一对多的关系,。没有节点这一说)

2.树需要注意的地方

1.一个树只能有一个根结点,但可以有多个子结点。

2.子结点的个数没有限制,但是子结点一定不能相交互。

3.结点的分类:(树的度 节点的度)

树的结点包含一个数据元素若干个指向其子树的分支。结点拥有的子树数称为结点的度(Degree)。度为0的结点称为叶结点(Leaf)或终端结点;度不为0的结点称为非终端结点或分支支结点。除根结点之外,分支结点也称为内部结点树的度是树内各结点的度的最大值。

4.结点间的关系:

结点的子树的根称为该结点的孩子(Child),相应的,该结点称为孩子的双亲(Parent)(注意是双亲,不是单亲)。同一个双亲的孩子之间互称兄弟(Sibling)。结点的祖先是从根到该结点所经分支上的所有结点。以某结点为根的子树中的任一结点都称为该结点的子孙。

5.树的其他相关概念:

结点的层次(Level)从根开始定义起,根为第一层,根的孩子为第二层。双亲在同一层的结点互为堂兄弟。树中结点的最大层次称为树的深度(Depth)或高度。

如果将树中结点的各子树看成从左至右是有次序的,不能互换,则称该树为有序树,否则为无序树。

森林(Forest)是m(m>=0)棵互不相交的树的集合

根结点没有父结点,其他的结点都有一个父结点,
子结点 :父结点的下一层。
叶子结点:没有子结点的结点。
结点的度:结点的子结点数。
树的度:最多的叶结点的度。
结点的层:根结点为1,依次类推。
高度 :树的最大层。
森林:

(二)、二叉树

二叉树的定义:

二叉树的每个结点的子结点最多只有两个子树的树结构。也就是说树的度为2

满二叉树的定义:

每一层的结点树都达到最大值。

完全二叉树的定义:

设二叉树的深度为k,除第k层外,其他各层(1~(k-1))的结点数都达到最大值第k层所有的结点都连续集中在最左边,这就是完全二叉树。

1.二叉树的创建:

创建结点:

public class Node{
        //数值
        Object item;
        //左右子结点
        Node left;
        Node right;
        public Node(Object item){
            this.item=item;
        }
    }

创建树:

public void CreateTree() {
        //创建根节点
        root=new Node(1);
        //第二层
        //创建左子结点
        Node Left=new Node(2);
        //创建右子结点
        Node Right=new Node(3);
        //进行关联
        root.left=Left;
        root.right=Right;
        //第三层
        Node Left2=new Node(4);
        //创建右子结点
        Node Right2=new Node(5);
        //进行关联
        root.left.left=Left2;
        root.left.right=Right2;
        //第三层
        Node Left3=new Node(6);
        //创建右子结点
        Node Right3=new Node(7);
        //进行关联
        root.right.left=Left3;
        root.right.right=Right3;
    }

前序遍历:

public void ShowTree(Node node){
        if(node==null){
            return;
        }
        //遍历根节点
        System.out.println(node.item);
        //遍历左子树
        ShowTree(node.left);
        //遍历右子树
        ShowTree(node.right);
    }

中序遍历:

public void MidShowTree(Node node){
        if(node==null){
            return;
        }
        //遍历左子树
        MidShowTree(node.left);
        //遍历根节点
        System.out.println(node.item);
        //遍历右子树
        MidShowTree(node.right);
    }

后序遍历:

public void FinShowTree(Node node){
        if(node==null){
            return;
        }
        //遍历左子树
        FinShowTree(node.left);
        //遍历右子树
        FinShowTree(node.right);
        //遍历根节点
        System.out.println(node.item);
    }

层次:

public void LeveTree(Node node){
        //创建队列;
        ArrayDeque <Node> ad=new ArrayDeque<>(10);
        //加入根节点
        ad.add(node);
        while (!ad.isEmpty()) {
            Node n=ad.poll();
            System.out.println(n.item);
            //左子树放到队列
            if(n.left!=null){
                ad.add(n.left);
            }
            //将右子树放到队列中去
            if(n.right!=null){
                ad.add(n.right);
            }
        }
    }

全部代码:

1.1.全部代码:
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.sql.SQLOutput;
import java.util.*;
import java.awt.*;
import java.lang.Math;
public class hello {
    public static void main(String []avgs){
    Tree t=new Tree();
    t.CreateTree();
    t.ShowTree(t.root);
        System.out.println("==============");
    t.MidShowTree(t.root);
        System.out.println("==============");
        t.FinShowTree(t.root);
        System.out.println("==============");
        t.LeveTree(t.root);
        System.out.println("==============");
        Tree.Node result=t.Select(t.root,13);
        if(result==null){
            System.out.println("无相等的结果");
        }else{
            System.out.println("有相等的结果为:"+result.item);
        }
        System.out.println("===========");
        t.Delete(t.root,1);
        t.LeveTree(t.root);
    }
}



相关文章
|
5月前
|
Java C语言
|
8月前
|
Java
JAVA循环结构
JAVA循环结构
38 3
|
Java
Java循环结构 1
Java循环结构
76 0
树型结构(二叉树的基础)
树型结构(二叉树的基础)
52 0
|
Java 索引
java循环结构-1
本章工作任务 实现查询商品价格功能 实现升级购物结算功能 实现升级菜单切换功能 本章技能目标
72 0
|
Java
Java循环结构 3
Java循环结构
88 0
|
Java
java循环结构-2
为了帮助张浩尽快提高成绩,老师给他安排了每天的学习任务:上午阅读教材,学习理论部分;下午上机编程,掌握代码部分。老师每天检查学习成果,如果不合格,则继续进行。
69 0