Java实现二叉树的定义和递归实现

定义


最多有两棵子树的有序树,称为二叉树。二叉树是一种特殊的

递归定义:二叉树是n(n>=0)个有限结点构成的集合。N=0称为空二叉树;n>0的二叉树由一个根结点和两互不相交的,分别称为左子树和右子树的二叉树构成。

二叉树中任何结点的第1个子树称为其左子树,左子树的根称为该结点的左孩子;二叉树中任何结点的第2个子树称为其右子树,左子树的根称为该结点的右孩子。如下图是一个二叉树:

图1.二叉树

满二叉树和完全二叉树

在一棵二叉树中,如果所有分支结点都存在左子树和右子树,并且叶子结点都在同一层上,这样的二叉树称作满二叉树。一棵深度为k且由2k-1个结点的二叉树称为满二叉树。

如果一棵具有n个结点的二叉树的结构与满二叉树的前n个结点的结构相同,这样的二叉树称作完全二叉树

图2. 满二叉树和完全二叉树


基本性质


这里规定二叉树的根结点的层次为1。

性质1:则二叉树的第i 层最多有2i-1个结点(在此二叉树的层次从1开始,i≥1)

性质2:深度为k的二叉树最多有2k-1个结点。(k≥1)

性质3:对任何一棵二叉树T, 如果其叶结点个数为n0, 度为2的非叶结点个数为n2, 则有

             n0 = n2 + 1

性质4:具有 n(n>0)个结点的完全二叉树的深度为⎣log2n⎦+1;⎦x⎦表示不超过x的最大整数。

性质5:如果对一棵有n个结点的完全二叉树的结点按层序编号(从第1层到第⎣l og2n⎦ +1层,每层从左到右),则对任一结点i(1≤i≤n),有:

(1)如果i=1,则结点i无双亲,是二叉树的根;如果i>1,则其双亲是结点⎣i/2⎦。

(2) 如果2i<=n, 则结点i的左孩子结点是2i;否则,结点i为叶子结点,无左孩子结点。

(3)如果2i+1<=n,则结点i的右孩子是结点2i+1; 否则,结点i为叶子结点,无右孩子结点。


抽象数据类型


数据元素:具有相同特性的数据元素的集合。

结构关系:树中数据元素间的结构关系由二叉树的定义确定。

基本操作:树的主要操作有

(1)创建树IntTree(&T)

(2)销毁树DestroyTree(&T)

(3)构造树CreatTree(&T,deinition)

(4)置空树ClearTree(&T)

(5)判空树TreeEmpty(T)

(6)求树的深度TreeDepth(T)

(7)获得树根Root(T)

(8)获取结点Value(T,cur_e,&e),将树中结点cur_e存入e单元中。

(9)数据赋值Assign(T,cur_e,value),将结点value,赋值于树T的结点cur_e中。

(10)获得双亲Parent(T,cur_e),返回树T中结点cur_e的双亲结点。

(11)获得最左孩子LeftChild(T,cur_e),返回树T中结点cur_e的最左孩子。

(12)获得右兄弟RightSibling(T,cur_e),返回树T中结点cur_e的右兄弟。

(13)插入子树InsertChild(&T,&p,i,c),将树c插入到树T中p指向结点的第i个子树之前。

(14)删除子树DeleteChild(&T,&p,i),删除树T中p指向结点的第i个子树。

(15)遍历树TraverseTree(T,visit())

二叉树的实现


二叉树接口BTree

 

[java]  view plain copy
  1. package datastructure.tree.btree;  
  2.   
  3. public interface BTree {  
  4.     /** 
  5.      * 添加左子树 
  6.      * @param lChild 左子树 
  7.      */  
  8.     public void addLeftTree(BTree lChild);  
  9.     /** 
  10.      * 添加右子树 
  11.      * @param rchild 右子树 
  12.      */  
  13.     public void addRightTree(BTree rchild) ;  
  14.     /** 
  15.      * 置空树 
  16.      */  
  17.     public void clearTree();  
  18.     /** 
  19.      * 求树的深度 
  20.      * @return 树的深度 
  21.      */  
  22.     public int dept();  
  23.     /** 
  24.      * 求左孩子 结点 
  25.      * @return 
  26.      */  
  27.     public BTree getLeftChild();  
  28.       
  29.     /** 
  30.      * 求右孩子结点 
  31.      * @return 
  32.      */  
  33.     public BTree getRightChild();  
  34.     /** 
  35.      * 获得根结点的数据 
  36.      * @return 
  37.      */  
  38.     public Object getRootData();  
  39.     /** 
  40.      * 是否有左子树 
  41.      * @return 
  42.      */  
  43.     public boolean hasLeftTree();  
  44.     /** 
  45.      * 是否有右子树 
  46.      * @return 
  47.      */  
  48.     public boolean hasRightTree();  
  49.     /** 
  50.      * 判断是否为空树 
  51.      * @return 如果为空,返回true,否则返回false 
  52.      */  
  53.     public boolean isEmpty();  
  54.     /** 
  55.      * 判断是否为叶子结点 
  56.      * @return 
  57.      */  
  58.     public boolean isLeaf();  
  59.     /** 
  60.      * 删除左子树 
  61.      */  
  62.     public void removeLeftChild();  
  63.     /** 
  64.      * 删除右子树 
  65.      */  
  66.     public void removeRightChild();  
  67.     /** 
  68.      * 获得树根 
  69.      * @return 树的根 
  70.      */  
  71.     public BTree root();  
  72.     /** 
  73.      * 设置根结点的数据 
  74.      */  
  75.     public void setRootData(Object data);  
  76.     /** 
  77.      * 求结点数 
  78.      * @return 结点的个数  
  79.      */  
  80.     public int size();  
  81. }  

二叉链表的实现

[java]  view plain copy
  1. package datastructure.tree.btree;  
  2.   
  3. public class LinkBTree implements BTree {  
  4.     private Object data;  
  5.     private BTree lChild;  
  6.     private BTree rChild;  
  7.       
  8.     public LinkBTree() {  
  9.         this.clearTree();  
  10.     }  
  11.     public LinkBTree(Object data) {  
  12.         this.data = data;  
  13.         this.lChild = null;  
  14.         this.rChild = null;  
  15.     }  
  16.     @Override  
  17.     public void addLeftTree(BTree lChild) {  
  18.         this.lChild = lChild;  
  19.     }  
  20.   
  21.     @Override  
  22.     public void addRightTree(BTree rChild) {  
  23.         this.rChild = rChild;  
  24.     }  
  25.   
  26.     @Override  
  27.     public void clearTree() {  
  28.         this.data = null;  
  29.         this.lChild = null;  
  30.         this.rChild = null;  
  31.     }  
  32.   
  33.     @Override  
  34.     public int dept() {  
  35.         return dept(this);  
  36.     }  
  37.       
  38.     private int dept(BTree btree) {  
  39.         if(btree.isEmpty()) {  
  40.             return 0;  
  41.         }else if(btree.isLeaf()) {  
  42.             return 1;  
  43.         } else {  
  44.             if(btree.getLeftChild() == null) {  
  45.                 return dept(btree.getRightChild()) + 1;  
  46.             } else if(btree.getRightChild() == null) {  
  47.                 return dept(btree.getLeftChild()) + 1;  
  48.             } else {  
  49.                 return Math.max(dept(btree.getLeftChild()), dept(btree.getRightChild()))+1;  
  50.             }  
  51.         }  
  52.     }  
  53.   
  54.     @Override  
  55.     public BTree getLeftChild() {  
  56.         return lChild;  
  57.     }  
  58.   
  59.   
  60.     @Override  
  61.     public BTree getRightChild() {  
  62.         return rChild;  
  63.     }  
  64.   
  65.     @Override  
  66.     public Object getRootData() {  
  67.         return data;  
  68.     }  
  69.   
  70.     @Override  
  71.     public boolean hasLeftTree() {  
  72.         if(lChild != null)  
  73.             return true;  
  74.         return false;  
  75.     }  
  76.   
  77.     @Override  
  78.     public boolean hasRightTree() {  
  79.         if(rChild != null)  
  80.             return true;  
  81.         return false;  
  82.     }  
  83.   
  84.     @Override  
  85.     public boolean isEmpty() {  
  86.         if((lChild == null && rChild == null && data == null) || this == null) {  
  87.             return true;  
  88.         }  
  89.         return false;  
  90.     }  
  91.       
  92.     @Override  
  93.     public boolean isLeaf() {  
  94.         if(lChild == null && rChild == null) {  
  95.             return true;  
  96.         }  
  97.         return false;  
  98.     }  
  99.   
  100.     @Override  
  101.     public void removeLeftChild() {  
  102.         lChild = null;  
  103.     }  
  104.   
  105.     @Override  
  106.     public void removeRightChild() {  
  107.         rChild = null;  
  108.     }  
  109.     @Override  
  110.     public BTree root() {  
  111.         return this;  
  112.     }  
  113.     @Override  
  114.     public void setRootData(Object data) {  
  115.         this.data = data;  
  116.     }  
  117.     @Override  
  118.     public int size() {  
  119.         return size(this);  
  120.     }  
  121.     private int size(BTree btree) {  
  122.         if(btree == null)   
  123.             return 0;  
  124.         else if(btree.isLeaf())   
  125.             return 1;  
  126.         else {  
  127.             if(btree.getLeftChild() == null) {  
  128.                 return size(btree.getRightChild()) + 1;  
  129.             } else if(btree.getRightChild() == null) {  
  130.                 return size(btree.getLeftChild()) + 1;  
  131.             } else {  
  132.                 return size(btree.getLeftChild()) + size(btree.getRightChild()) + 1;  
  133.             }  
  134.         }   
  135.     }  
  136.       
  137.   
  138. }  


二叉树的遍历

 二叉树的遍历是指按照一定的次序访问树中所有结点,并且每个结点只被访问一次的过程。通常的遍历有三种方式,分别是:前序遍历、中序遍历和后序遍历,假设根结点、左孩子结点和右孩子结点分别用D、R、L表示,则前序遍历、中序遍历和后序遍历的顺序分别为DLR、LDR、LRD。所谓访问某结点,一般指对结点中的数据进行某种操作。所以,我们可以定义一个对结点中的数据进行操作的接口Visit,让所有遍历树的类实现这个接口。

Visit接口:

[java]  view plain copy
  1. package datastructure.tree;  
  2. /** 
  3.  * 对结点进行操作的接口 
  4.  * @author Administrator 
  5.  * 
  6.  */  
  7. public interface Visit {  
  8.     /** 
  9.      * 对结点进行某种操作 
  10.      * @param btree 树的结点 
  11.      */  
  12.     public void visit(BTree btree);  
  13. }  

遍历二叉树


[java]  view plain copy
  1. package datastructure.tree;  
  2. /** 
  3.  * 遍历二叉树 
  4.  * @author Administrator 
  5.  * 
  6.  */  
  7. public class OrderBTree implements Visit{  
  8.     /** 
  9.      * 前序遍历 
  10.      * @param root 根结点 
  11.      */  
  12.     public void preOrder(BTree root) {  
  13.         visit(root);  
  14.         if(root.getLeftChild() != null) {  
  15.             preOrder(root.getLeftChild());  
  16.         }  
  17.         if(root.getRightChild() != null) {  
  18.             preOrder(root.getRightChild());  
  19.         }  
  20.     }  
  21.     /** 
  22.      * 中序遍历 
  23.      * @param root 根结点 
  24.      */  
  25.     public void inOrder(BTree root) {  
  26.         if(root.getLeftChild() != null)  
  27.             inOrder(root.getLeftChild());  
  28.         visit(root);  
  29.         if(root.getRightChild() != null) {  
  30.             //System.out.println("true");  
  31.             inOrder(root.getRightChild());  
  32.         }  
  33.     }  
  34.     /** 
  35.      * 后序遍历 
  36.      * @param root 根结点 
  37.      */  
  38.     public void postOrder(BTree root) {  
  39.         if(root.getLeftChild() != null)  
  40.             postOrder(root.getLeftChild());  
  41.         if(root.getRightChild() != null)  
  42.             postOrder(root.getRightChild());  
  43.         visit(root);  
  44.     }  
  45.   
  46.     @Override  
  47.     public void visit(BTree btree) {  
  48.         System.out.print(btree.getRootData() + "\t");  
  49.     }  
  50.   
  51. }  

二叉树的测试


要构建的树

[java]  view plain copy
  1. package datastructure.tree;  
  2. /** 
  3.  * 测试二叉树 
  4.  * @author Administrator 
  5.  * 
  6.  */  
  7. public class BTreeTest {  
  8.     public static void main(String args[]) {  
  9.         BTree btree = new LinkBTree('A');  
  10.         BTree bt1, bt2, bt3, bt4;  
  11.         bt1 = new LinkBTree('B');  
  12.         btree.addLeftTree(bt1);  
  13.         bt2 = new LinkBTree('D');  
  14.         bt1.addLeftTree(bt2);  
  15.           
  16.         bt3 =  new LinkBTree('C');  
  17.         btree.addRightTree(bt3);  
  18.         bt4 =  new LinkBTree('E');  
  19.         bt3.addLeftTree(bt4);  
  20.         bt4 =  new LinkBTree('F');  
  21.         bt3.addRightTree(bt4);  
  22.           
  23.         System.out.println("树的深度:" + btree.dept());  
  24.         System.out.println("树的结点数:" + btree.size());  
  25.         System.out.println("是否为空树:" + btree.isEmpty());  
  26.         System.out.println("是否为叶子结点:" + btree.isLeaf());  
  27.         System.out.println("最左下边结点是否为叶子结点:" + btree.getRightChild().getRightChild().isLeaf());  
  28.         System.out.println("root结点:" + btree.root());  
  29.           
  30.         OrderBTree order = new OrderBTree();  
  31.         System.out.println("\n前序遍历:");  
  32.         order.preOrder(btree);  
  33.         System.out.println("\n中序遍历:");  
  34.         order.inOrder(btree);  
  35.         System.out.println("\n后序遍历:");  
  36.         order.postOrder(btree);  
  37.           
  38.         btree.removeLeftChild();  
  39.         System.out.println("\n删除左子树后中序遍历为:");  
  40.         order.inOrder(btree);  
  41.     }  
  42. }  

结果如下:

树的深度:3
树的结点数:6
是否为空树:false
是否为叶子结点:false
最左下边结点是否为叶子结点:true
root结点:datastructure.tree.LinkBTree@dc8569


前序遍历:
A B DCEF
中序遍历:
D B AECF
后序遍历:
D B EFCA
删除左子树后中序遍历为:
A E CF
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
VR(Virtual Reality)即虚拟现实,是一种可以创建和体验虚拟世界的计算机技术。它利用计算机生成一种模拟环境,是一种多源信息融合的、交互式的三维动态视景和实体行为的系统仿真,使用户沉浸到该环境中。VR技术通过模拟人的视觉、听觉、触觉等感觉器官功能,使人能够沉浸在计算机生成的虚拟境界中,并能够通过语言、手势等自然的方式与之进行实时交互,创建了一种适人化的多维信息空间。 VR技术具有以下主要特点: 沉浸感:用户感到作为主角存在于模拟环境中的真实程度。理想的模拟环境应该使用户难以分辨真假,使用户全身心地投入到计算机创建的三维虚拟环境中,该环境中的一切看上去是真的,听上去是真的,动起来是真的,甚至闻起来、尝起来等一切感觉都是真的,如同在现实世界中的感觉一样。 交互性:用户对模拟环境内物体的可操作程度和从环境得到反馈的自然程度(包括实时性)。例如,用户可以用手去直接抓取模拟环境中虚拟的物体,这时手有握着东西的感觉,并可以感觉物体的重量,视野中被抓的物体也能立刻随着手的移动而移动。 构想性:也称想象性,指用户沉浸在多维信息空间中,依靠自己的感知和认知能力获取知识,发挥主观能动性,寻求解答,形成新的概念。此概念不仅是指观念上或语言上的创意,而且可以是指对某些客观存在事物的创造性设想和安排。 VR技术可以应用于各个领域,如游戏、娱乐、教育、医疗、军事、房地产、工业仿真等。随着VR技术的不断发展,它正在改变人们的生活和工作方式,为人们带来全新的体验。
基于GPT-SoVITS的视频剪辑快捷配音工具 GPT, 通常指的是“Generative Pre-trained Transformer”(生成式预训练转换器),是一个在自然语言处理(NLP)领域非常流行的深度学习模型架构。GPT模型由OpenAI公司开发,并在多个NLP任务上取得了显著的性能提升。 GPT模型的核心是一个多层Transformer解码器结构,它通过在海量的文本数据上进行预训练来学习语言的规律。这种预训练方式使得GPT模型能够捕捉到丰富的上下文信息,并生成流畅、自然的文本。 GPT模型的训练过程可以分为两个阶段: 预训练阶段:在这个阶段,模型会接触到大量的文本数据,并通过无监督学习的方式学习语言的结构和规律。具体来说,模型会尝试预测文本序列中的下一个词或短语,从而学习到语言的语法、语义和上下文信息。 微调阶段(也称为下游任务训练):在预训练完成后,模型会被应用到具体的NLP任务中,如文本分类、机器翻译、问答系统等。在这个阶段,模型会使用有标签的数据进行微调,以适应特定任务的需求。通过微调,模型能够学习到与任务相关的特定知识,并进一步提高在该任务上的性能。 GPT模型的优势在于其强大的生成能力和对上下文信息的捕捉能力。这使得GPT模型在自然语言生成、文本摘要、对话系统等领域具有广泛的应用前景。同时,GPT模型也面临一些挑战,如计算资源消耗大、训练时间长等问题。为了解决这些问题,研究人员不断提出新的优化方法和扩展模型架构,如GPT-2、GPT-3等,以进一步提高模型的性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值