java和python编写二叉树
来源:互联网 发布:关于les的歌网络歌手 编辑:程序博客网 时间:2024/06/05 18:30
一、思维预备
1、包装和拆包
包装:将基本数据类型或者没有属性或者功能的对象传换成或者装饰成具有一定的属性和功能的实用类或者包装类。
拆包:包装类或者实用类转化成基本数据类型。
2、指针或者引用
指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
本文将一个内存空间里或者变量单元里存储另一个内存空间的地址。换句话说该变量空间引用另一个内存空间的数据或者对象。
3、二叉树存储结构(二叉树的形成过程)
二叉树是一种特殊的顺序树,它规定有左右两个孩子,即左右孩子顺序不能替换,本文就把左边的孩子比结点小,右边的比结点大。
二叉树数据存储结构下面是理解的二叉树的存储结构(这些都是个人理解所得,有所偏差,如果感到错误请联系博主);
注意:
1、一个结点只决定它的左右结点的顺序,并且左右结点的数据的位置只与它有关。
2、数据的顺序也与数据的添加顺序有关。换句话说二叉树整体看着无序,局部有序。二叉树排序最后结果还与遍历的方式有关。
3、数据的内存地址可以为空,相当于下面没有数据
4、二叉树中只要有左右孩子(左右结点)的结点。它们三个或者两个的大小关系必须一致。比如一个结点的左结点总比它大,右结点总比它小。次序不能颠倒。
实现方式:递归方式
4、二叉树的遍历方式
叶结点:该节点没有左子树和右子树。
根结点:该节点必须有左子树或者右子树。
遍历即将树的所有结点访问且仅访问一次。按照根节点位置的不同分为前序遍历,中序遍历,后序遍历。
前序遍历:根节点->左子树->右子树
中序遍历:左子树->根节点->右子树
后序遍历:左子树->右子树->根节点
遍历实现方式:
1、递归实现
2、非递归实现
因为当遍历过根节点之后还要回来,所以必须将其存起来。考虑到后进先出的特点,选用栈存储。数量确定,以顺序栈存储。
3、迭代器实现
二、代码实现
思考:按照上述的知识点介绍完全可以将数据进行包装,使其具有数据,左结点,和右结点(左右结点存的都是对象的引用),可以把这三个看做一个单元。为了保证每个单元之间的联系,用内部类来实现。
1、python代码
#封装结点class Node: __left=None __right=None __data=None __isdelete=False def set__isdelete(self,delete): self.__isdelete=delete def get__data(self): return self.__data def get__left(self): return self.__left def get__right(self): return self.__right def get__isdelete(self): return self.__isdelete def set__data(self): return self.__data #初始化数据 def __init__(self,data=None): self.__data=data #追加数据 def append(self,data=None): if self.__data > data: if self.__left is None: self.__left=Node(data) else: self.__left.append(data) elif self.__data< data: if self.__right is None: self.__right=Node(data) else: self.__right.append(data) else: print('插入重复的数据:',data) #中遍历,打印数据,注意:递归一定要有一个终止条件,并且必须能够终止递归 def inorder(self): if self.__left is not None: self.__left.inorder() if self.__isdelete==False: print(self.__data) if self.__right is not None: self.__right.inorder()#包装结点class packNode: root=None currentNode=None def __init__(self,data=None): self.root=Node(data) self.currentNode=self.root #追加数据 def append(self,data=None): self.root.append(data) #遍历数据 def inorder(self): self.root.inorder(); #查询数据 def search(self,data): node=self.root while True: if node is not None: if node.get__data() ==data: print("已查到数据:",node.get__data()) return node elif node.get__data()<data: node=node.get__right() else: node=node.get__left() #删除数据 def delete(self,data): result=self.search(data) if result is None: print('删除失败!') else: result.set__isdelete(True) print('删除成功!') #修改数据 def modify(self,old,new): result=self.search(old) if result is not None: if result.get__isdelete() ==False: result.set__data(new) print('修改成功!') else: print('修改失败!') else: print('修改失败')bTree = packNode(6)bTree.append(12)bTree.append(2)bTree.append(22)bTree.append(5)bTree.append(34)bTree.append(7)bTree.append(9)bTree.append(30)bTree.append(1)#输出bTree.inorder()#查找bTree.search(9)# #删除bTree.delete(1)# #修改bTree.modify(56,78)
结果如下:
12567912223034已查到数据: 9已查到数据: 1删除成功!
2、java代码
public class TreeNode {// 左指针结点 TreeNode leftTreeNode;// 右指针结点 TreeNode rightTreeNode;// 数据 private int value;//判断是否被删除 private boolean isDelete=false; public boolean isDelete() { return isDelete; } public void setDelete(boolean isDelete) { this.isDelete = isDelete; } public TreeNode(TreeNode leftTreeNode, TreeNode rightTreeNode, int value) { super(); this.leftTreeNode = leftTreeNode; this.rightTreeNode = rightTreeNode; this.value = value; this.isDelete=false; } public TreeNode(int value) { this(null,null,value); } public TreeNode() { super(); } public TreeNode getLeftTreeNode() { return leftTreeNode; } public void setLeftTreeNode(TreeNode leftTreeNode) { this.leftTreeNode = leftTreeNode; } public TreeNode getRightTreeNode() { return rightTreeNode; } public void setRightTreeNode(TreeNode rightTreeNode) { this.rightTreeNode = rightTreeNode; } public int getvalue() { return value; } public void setvalue(int value) { this.value = value; } @Override public String toString() { return "TreeNode [leftTreeNode=" + leftTreeNode + ", rightTreeNode=" + rightTreeNode + ", value=" + value + "]"; } }public class BinaryTree {// 根结点 private TreeNode root; public TreeNode getRoot() { return root; } public void setRoot(TreeNode root) { this.root = root; } /** *查数据结点、如果要根结点的数比所要查找的数大,与右结点的数比较,如果要根结点的数比所要查找的数小,与左结点的数比较 */ public TreeNode search(int key){ TreeNode currentNode=root; if(currentNode!=null){ while(currentNode.getvalue()!=key){ if(currentNode.getvalue()<key){ currentNode=currentNode.getRightTreeNode(); }else{ currentNode=currentNode.getLeftTreeNode(); } if(currentNode ==null){ return null; } } if(currentNode.isDelete()==true){ return null; }else{ return currentNode; } }else{ return null; } } /** * 修改数据结点 */ public void replace(int oldNum,int newNum){ TreeNode oldNode=search(oldNum); if(oldNode!=null && oldNode.isDelete()==false){ oldNode.setvalue(newNum); }else{ System.out.println("没有查找到该数据!"); } } /** * 删除结点 */ public void delete(TreeNode treeNode,int value){ TreeNode node=search(value); if(node!=null && node.isDelete()==false){ node.setDelete(true); }else{ System.out.println("没有查找到该数据!"); } } /** * 添加数据结点 */ public void add(int value){// 将新增加进行用TreeNode进行包装 TreeNode newTreeNode = new TreeNode(value); if(root==null){ root=newTreeNode; }else{// 防止左右结点不为空,用死循环 TreeNode currentNode= root; TreeNode parentNode; for(;;){// 当左右接点有一个值时,在这个根结点还要追加数据则需要指针不断的移动 parentNode=currentNode; if(currentNode.getvalue()>newTreeNode.getvalue()){ currentNode=currentNode.getLeftTreeNode(); if(currentNode == null){ parentNode.setLeftTreeNode(newTreeNode); return; } }else if(currentNode.getvalue()<newTreeNode.getvalue()){ currentNode=currentNode.getRightTreeNode(); if(currentNode ==null){ parentNode.setRightTreeNode(newTreeNode); return; } }else{ System.out.println("存在相邻的相同的数,该数不能添加"); return;//防止死循环 } } } } /** * 中序遍历 */ public void inOrder(TreeNode treeNode){ if(treeNode!=null ){ inOrder(treeNode.getLeftTreeNode()); if(treeNode.isDelete()==false){ System.out.println(treeNode.getvalue()); } inOrder(treeNode.getRightTreeNode()); } }}public class TestBTree { public static void main(String[] args) { BinaryTree bTree=new BinaryTree(); bTree.add(2); bTree.add(5); bTree.add(9); bTree.add(10); bTree.add(3); bTree.add(90); bTree.add(56); bTree.add(91); TreeNode bTree1 =bTree.getRoot(); System.out.println("root="+bTree.getRoot().getvalue()); bTree.inOrder(bTree1); System.out.println(bTree1.getvalue()); TreeNode result=bTree.search(3); System.out.println("查找的数据是:"+result.getvalue());// 修改数据1为45 bTree.replace( 1, 45); System.out.println("修改后的数据"); bTree.inOrder(bTree1);// 删除2 bTree.delete(bTree1, 2); System.out.println("删除后:"); bTree.inOrder(bTree1); }}
- java和python编写二叉树
- java编写二叉树
- 【编程练习】二叉树的反转,Java和Python实现
- java编写二叉树以及前序遍历、中序遍历和后序遍历
- java编写二叉树以及前序遍历、中序遍历和后序遍历
- 用java语言编写的简单二叉树
- python中创建和遍历二叉树
- python java 和 C++编写程序的比较
- 采用java和python编写hive中的udf
- java和python的结合------python编写的udpserver,java语言写的udpclient
- java数据结构二叉树的遍历和二叉查找树
- 通过编写自定义链表和二叉树增进对链表和二叉树的了解
- Python和C++编写block
- python编写FCFS和SJF
- 树和二叉树在java中
- 数据结构(Java)--树和二叉树
- Java 实现二叉树排序和查找
- java 二叉树的实现 和遍历
- lua下使用protobuf
- 转来的 cuda makefile 写法学习
- 移动购物APP设计与实现
- redis+twemproxy+socket访问
- 区块链技术应用在金融领域之大数据风控
- java和python编写二叉树
- 从事性能测试工作需要掌握要学习的知识
- 玩机:解决小米手机锁屏忘记密码无法解锁
- linux下用sox批量将pcm文件加wav头、批量修改采样率、切音频
- ZOJ
- 基于Retrofit实现HTTPS思路
- android ui的几个概念:px,dip(dp),sp,dpi,分辨率等
- Scala入门到精通——第二十九节 Scala数据库编程
- AndroidManifest.xml uses-feature 详解