二叉查找树 我就是我 2022-05-13 01:40 279阅读 0赞 <table> <tbody> <tr> <td> <p>package 树;</p> <p>import java.util.Stack;</p> <p>/**<br> * 定义一个结点<br> */<br> class Node{ <br> Node left = null;<br> Node right = null;<br> Integer data;<br> public Node(Integer data){ <br> this.data = data;<br> }<br> }</p> <p>public class BinarySearchTree { <br> Node root = null;<br> <br> /**<br> * 添加元素<br> */<br> public void addNode(Integer data){ <br> Node node = new Node(data);<br> if(root == null){ <br> root = node;<br> return;<br> }<br> Node temp = root;<br> while(true){ <br> if(data<temp.data){//小于的情况<br> if(temp.left == null){ <br> temp.left = node;<br> return;<br> }else{ <br> temp = temp.left;<br> }<br> }else if(data>temp.data){//大于的情况<br> if(temp.right == null){ <br> temp.right = node;<br> return;<br> }else{ <br> temp = temp.right;<br> }<br> }else{ //相等的情况(去重复)<br> return;<br> }<br> }<br> }<br> <br> /**<br> * 删除元素<br> * 思路:<br> * 如果节点是叶子结点,可以直接删除。<br> * 如果节点有一个子节点,则将父节点直接指向其子节点。<br> * 如果节点有两个子节点(最为复杂),用其右子树中的最小的数据代替该节点的数据并递归地删除那个节点。<br> */<br> <br> /**<br> * 判断是否包含某元素<br> */<br> public boolean isContains(Integer data){ <br> if(root == null){ <br> return false;<br> }<br> Node temp = root;<br> while(true){ <br> if(data<temp.data){//小于的情况<br> if(temp.left == null){ <br> return false;<br> }else{ <br> temp = temp.left;<br> }<br> }else if(data>temp.data){//大于的情况<br> if(temp.right == null){ <br> return false;<br> }else{ <br> temp = temp.right;<br> }<br> }else{ //相等的情况<br> return true;<br> }<br> }<br> }<br> <br> /**<br> * 求二叉搜索树的高度<br> */<br> public int getHeight(){ <br> return getHeight(root);<br> }<br> <br> private int getHeight(Node node) { <br> if(node == null){ <br> return 0;<br> }<br> int i = getHeight(node.left);<br> int j = getHeight(node.right);<br> return (i>j)?i+1:j+1;<br> }</p> <p> /**<br> * 求二叉搜索树的节点个数<br> */<br> public int getSize(){ <br> return getSize(root);<br> }<br> <br> private int getSize(Node node) { <br> if(node == null){ <br> return 0;<br> }<br> return 1+getSize(node.left)+getSize(node.right);<br> }<br> <br> /**<br> * 求二叉搜索树中的最大值<br> */<br> public Integer getMax(){ <br> if(root == null){ <br> return null;<br> }<br> Node temp = root;<br> while(temp.right!=null){ <br> temp = temp.right;<br> }<br> return temp.data;<br> }<br> <br> /**<br> * 求二叉搜索树中的最小值<br> */<br> public Integer getMin(){ <br> if(root == null){ <br> return null;<br> }<br> Node temp = root;<br> while(temp.left!=null){ <br> temp = temp.left;<br> }<br> return temp.data;<br> }</p> <p> /**<br> * 前序遍历方法递归实现<br> */<br> private void preOrder(Node root) { <br> if(root == null){ <br> return;<br> }else{ <br> System.out.print(root.data+" ");<br> preOrder(root.left);<br> preOrder(root.right);<br> }<br> }<br> <br> /**<br> * 前序遍历方法非递归实现<br> * <br> * 思路:<br> * 栈s初始化<br> * 在while(true)中循环<br> * 当root不空时循环<br> * 输出root.data<br> * 将指针root的值保存到栈中<br> * 继续遍历root的左子树<br> * 如果栈s为空,break;<br> * 如果栈s不为空,则<br> * 将栈顶元素弹出至root<br> * 准备遍历root的右子树<br> */<br> public void pre(Node root){ <br> //栈的初始化,建一个空栈<br> Stack<Node> stack = new Stack<Node>();<br> //循环<br> while(true){ <br> //当root不为空时<br> while(root!=null){ <br> //输出根节点<br> System.out.print(root.data+" ");<br> //根节点进栈<br> stack.push(root);<br> //继续遍历左子树,迭代<br> root = root.left;<br> }<br> //当栈为空时<br> if(stack.isEmpty()){ <br> break;<br> }else{//当栈不为空时<br> root = stack.pop();//出栈,栈顶元素传给root<br> root = root.right;<br> }<br> }<br> }<br> <br> /**<br> * 中序遍历方法递归实现<br> */<br> private void midOrder(Node root) { <br> if(root == null){ <br> return;<br> }else{ <br> midOrder(root.left);<br> System.out.print(root.data+" ");<br> midOrder(root.right);<br> }<br> }<br> <br> /**<br> * 中序遍历方法非递归实现<br> */<br> public void mid(Node root){ <br> //栈的初始化,建一个空栈<br> Stack<Node> stack = new Stack<Node>();<br> //循环<br> while(true){ <br> //当root不为空时<br> while(root!=null){ <br> //根节点进栈<br> stack.push(root);<br> //继续遍历左子树,迭代<br> root = root.left;<br> }<br> //当栈为空时<br> if(stack.isEmpty()){ <br> break;<br> }else{//当栈不为空时<br> root = stack.pop();//出栈,栈顶元素传给root<br> //输出根节点<br> System.out.print(root.data+" ");<br> root = root.right;<br> }<br> }<br> }<br> <br> /**<br> * 后序遍历方法递归实现<br> */<br> private void aftOrder(Node root) { <br> if(root == null){ <br> return;<br> }else{ <br> aftOrder(root.left);<br> aftOrder(root.right);<br> System.out.print(root.data+" ");<br> }<br> }<br> <br> /**<br> * 后序遍历方法非递归实现<br> */<br> public void aft(Node root){ <br> //栈的初始化,建一个空栈<br> Stack<Node> stack = new Stack<Node>();<br> //循环<br> while(true){ <br> //当root不为空时<br> while(root!=null){ <br> //根节点进栈<br> stack.push(root);<br> //继续遍历左子树,迭代<br> root = root.left;<br> }<br> //当前结点的左右子节点都为空时,输出<br> //当前结点的右子节点输出后,该节点可以随之输出<br> while(!stack.isEmpty() && stack.peek().right==root){ <br> root = stack.pop();<br> System.out.print(root.data+" ");<br> }<br> //当栈为空时<br> if(stack.isEmpty()){ <br> break;<br> }else{//当栈不为空时<br> root = stack.peek().right;<br> }<br> }<br> }<br> <br> <br> /**<br> * 主函数<br> */<br> public static void main(String[] args) { <br> BinarySearchTree bst = new BinarySearchTree();<br> //构建二叉搜索树<br> int[] arr = {4,5,1,2};<br> for(int i:arr){ <br> bst.addNode(i);<br> }<br> <br> System.out.println("中序遍历:");<br> bst.midOrder(bst.root);<br> System.out.println();<br> System.out.println("中序遍历:");<br> bst.mid(bst.root);<br> System.out.println();<br> <br> System.out.println("前序遍历(递归):");<br> bst.preOrder(bst.root);<br> System.out.println();<br> System.out.println("前序遍历(非递归):");<br> bst.pre(bst.root);<br> System.out.println();<br> <br> System.out.println("后序遍历(递归):");<br> bst.aftOrder(bst.root);<br> System.out.println();<br> System.out.println("后序遍历(非递归):");<br> bst.aft(bst.root);<br> System.out.println();<br> }<br> }</p> </td> </tr> </tbody> </table>
相关 leetcode——二叉树、二叉查找树 leetcode——二叉树、二叉查找树 104. 二叉树的最大深度 111. 二叉树的最小深度 226. 翻转二叉树 r囧r小猫/ 2022年09月05日 12:39/ 0 赞/ 255 阅读
相关 二叉查找树 二叉查找树是二叉树中最常用的一种类型,也叫二叉搜索树。顾名思义,二叉查找树是为了实现快速查找而生的。不过,它不仅仅支持快速查找一个数据,还支持快速插入、删除一个数据。它是怎么做 港控/mmm°/ 2022年08月28日 03:51/ 0 赞/ 256 阅读
相关 二叉查找树 本文将会介绍一种能够将链表插入的灵活性和有序数组查找的高效性结合在一起的符号表实现。 定义 一颗二叉查找树(BST)是一颗二叉树,其中每个结点都含有一个Comparab 布满荆棘的人生/ 2022年07月16日 00:22/ 0 赞/ 231 阅读
相关 二叉查找树 package 树; /\\ \ 定义一个结点 \/ class Node\{ Node left = null; Node righ ╰+攻爆jí腚メ/ 2022年05月26日 07:49/ 0 赞/ 343 阅读
相关 二叉树(四)---查找二叉树 上次我说了如何去遍历一棵二叉树,今天我来说一说查找二叉树是怎样实现的。 首先我来介绍一下查找二叉树是怎样生成的。 这个是我为我的二叉树设置的一些基础的组成数据结构 深碍√TFBOYSˉ_/ 2022年05月25日 09:37/ 0 赞/ 282 阅读
相关 二叉查找树 <table> <tbody> <tr> <td> <p>package 树;</p> <p>import java.util.Stack;</p> <p>/ 我就是我/ 2022年05月13日 01:40/ 0 赞/ 280 阅读
相关 二叉查找树 二叉查找树 概念 二叉查找树,又称为二叉排序树、二叉搜索树。 二叉查找树有以下几个特性 若左子树不空,则左子树上所有结点的值均小于它的根结点的值 若 旧城等待,/ 2022年04月10日 02:39/ 0 赞/ 491 阅读
相关 二叉查找树 / 这是一个二叉查找树,实现了以下操作:插入结点、构造二叉树、删除结点、查找、 查找最大值、查找最小值、查找指定结点的前驱和后继。上述所有操作时 迈不过友情╰/ 2022年02月26日 11:48/ 0 赞/ 345 阅读
相关 二叉查找树 二叉查找树有这几个规则 1、若左子树不为空,那么左子树所有节点的值小于均小于他的根节点的值。 2、若右子树不为空,那么右子树的所有节点的值大于根节点的值。 3、左右子树也 ﹏ヽ暗。殇╰゛Y/ 2021年09月22日 09:40/ 0 赞/ 546 阅读
相关 二叉查找树 理解 在二叉树的基础上,假设一个节点值都为Integer类型,现在有一个节点A,那么A的左子树中的所有值一定小于A节点的值,A的右子树中的所有值一定大于A的节点的值,如果 清疚/ 2021年09月11日 06:56/ 0 赞/ 543 阅读
还没有评论,来说两句吧...