成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

【數據結構】二分搜索樹詳解

開發 前端
樹是一種很特別的數據結構,樹這種數據結構叫做 “樹” 就是因為它 長得像一棵樹 。但是這棵樹畫成的圖長得卻是一棵倒著的樹,根在上,葉在下。

[[400829]]

一、樹結構

樹是一種很特別的數據結構,樹這種數據結構叫做 “樹” 就是因為它 長得像一棵樹 。但是這棵樹畫成的圖長得卻是一棵倒著的樹,根在上,葉在下。樹是圖的一種,樹和圖的區別就在于:樹是沒有環的,而圖是可以有環的。

樹狀圖是一種數據結構,它是由n(n>=1)個有限節點組成一個具有層次關系的集合。把它叫做“樹”是因為它看起來像一棵倒掛的樹,也就是說它是根朝上,而葉朝下的。

二、為什么要有樹結構

2.1 樹結構是一種天然的組織結構

比如說電腦中的文件夾,我們需要找到一個特定的文件,需要到某個文件夾下去找這個文件,計算機的文件存儲的結構來源于生活。再比如說圖書館,我們知道圖書館里面有 歷史類、數理類、計算機類,我們想要找到關于java的書籍,就需要到計算機類的Java中去找到我們需要的圖書

比如公司里面的層級結構:CEO、HR CTO等等,還有我們比較常見的家譜等等,都是類似于樹結構

將數據使用樹結構后,會更加的高效

三、二分搜索樹

3.1 特點

  • 二分搜索樹是一個動態數據結構
  • 二分搜索樹也是一顆二叉樹(也叫多叉樹)
  • 二分搜索樹的每個節點的值都大于其左子樹的所有節點的值,同時每個節點的值都小于其右子樹的所有節點的值
  • 存儲的元素必須有可比較性, Java中的話就要求二分搜索樹保存的數據類型要實現Comparable接口, 或者使用額外的比較器實現
  • 每一顆子樹也是二分搜索樹
  • 二分搜索樹具有唯一根節點,同時在二叉樹中最底下是它的葉子節點

  • 二分搜索樹具有唯根節點,每個節點最多有兩個孩子(左邊的叫左孩子,右邊的叫右孩子),同時每個節點最多有一個父親

二分搜索樹天然的具有遞歸特性

  • 每個節點的左子樹也是二叉樹
  • 每個節點的右子樹也是二叉樹

二叉樹不一定是滿的,一個接電腦也是二叉樹、空也是二叉樹

四、具體代碼實現

在進行相關操作之前, 先定義一個支持泛型的節點類, 用于存儲二分搜索樹每個節點的信息, 這個類作為二分搜索樹的一個內部類, 二分搜索樹的類聲明以及Node節點類聲明如下:

  1. public class BST> { 
  2.  
  3. private class Node{ 
  4.  
  5. public E e; 
  6.  
  7. public Node left,right
  8.  
  9. public Node(E e){ 
  10.  
  11. this.e = e; 
  12.  
  13. left = null
  14.  
  15. right = null
  16.  
  17.  
  18.  
  19. //節點 
  20.  
  21. private Node root; 
  22.  
  23. // 樹容量 
  24.  
  25. private int size
  26.  
  27. public BST(){ 
  28.  
  29. root = null
  30.  
  31. size = 0; 
  32.  
  33.  
  34. public int size(){ 
  35.  
  36. return size
  37.  
  38.  
  39. public boolean isEmpty(){ 
  40.  
  41. return size == 0; 
  42.  
  43.  

4.1 添加元素

二分搜索樹添加元素的非遞歸寫法,和鏈表很像,由于二分搜索樹本身的遞歸特性, 所以可以很方便的使用遞歸實現向二分搜索樹中添加元素,

代碼實現:

  1. //向二分搜索樹添加新的元素e 
  2.  
  3. public void add(E e){ 
  4.  
  5. root = add(root,e); 
  6.  
  7.  
  8. //向以Node為根的二分搜索樹中插入元素 E,遞歸算法 
  9.  
  10. //返回插入新節點后二分搜索樹的根 
  11.  
  12. private Node add(Node node,E e){ 
  13.  
  14. if(node == null){ 
  15.  
  16. size++; 
  17.  
  18. return new Node(e); 
  19.  
  20.  
  21. if(e.compareTo(node.e) < 0) 
  22.  
  23. node.left = add(node.left,e); 
  24.  
  25. else if(e.compareTo(node.e) > 0) 
  26.  
  27. node.right = add(node.right,e); 
  28.  
  29. return node; 
  30.  

4.2 查找元素

由于二分搜索樹沒有下標, 所以針對二分搜索樹的查找操作, 我們需要定義一個 contains() 方法, 查看二分搜索樹是否包含某個元素, 返回一個布爾型變量

代碼實現:

  1. //看二分是搜索樹中是否包含元素e 
  2.  
  3. public boolean contains(E e){ 
  4.  
  5. return contains(root,e); 
  6.  
  7.  
  8. //看以Node為根的二分搜索樹中是否包含元素e,遞歸算法 
  9.  
  10. private boolean contains(Node node,E e){ 
  11.  
  12. if(node == null
  13.  
  14. return false
  15.  
  16. if(e.compareTo(node.e) == 0) 
  17.  
  18. return true
  19.  
  20. else if(e.compareTo(node.e) < 0) 
  21.  
  22. return contains(node.left,e); 
  23.  
  24. else //e.compareTo(node.e) > 0 
  25.  
  26. return contains(node.right,e); 
  27.  

4.3 遍歷操作

一、 什么是遍歷操作

  • 遍歷操作就是把所有的節點都訪問一遍
  • 訪問的原因和業務相關
  • 遍歷分類

前序遍歷 : 對當前節點的遍歷在對左右孩子節點的遍歷之前, 遍歷順序 : 當前節點->左孩子->右孩子中序遍歷 : 對當前節點的遍歷在對左右孩子節點的遍歷中間, 遍歷順序 : 左孩子->當前節點->右孩子后序遍歷 : 對當前節點的遍歷在對左右孩子節點的遍歷之后, 遍歷順序 : 左孩子->右孩子->當前節點

二、 前序遍歷

  1. //二分搜索樹前序遍歷 
  2.  
  3. public void preOrder(){ 
  4.  
  5. preOrder(root); 
  6.  
  7.  
  8. //前序遍歷以Node為根的二分搜索樹,遞歸算法 
  9.  
  10. private void preOrder(Node node){ 
  11.  
  12. if(node == null
  13.  
  14. return
  15.  
  16. System.out.println(node.e); 
  17.  
  18. preOrder(node.left); 
  19.  
  20. preOrder(node.right); 
  21.  
  22.  
  23. public void preOrderNR(){ 
  24.  
  25. Stack stack = new Stack<>(); 
  26.  
  27. stack.push(root); 
  28.  
  29. while(!stack.isEmpty()){ 
  30.  
  31. Node cur = stack.pop(); 
  32.  
  33. System.out.println(cur.e); 
  34.  
  35. if(cur.right != null
  36.  
  37. stack.push(cur.right); 
  38.  
  39. if(cur.left != null
  40.  
  41. stack.push(cur.left); 
  42.  
  43.  

三、 中序遍歷

  1. //二分搜索樹的中序遍歷 
  2.  
  3. public void inOrder(){ 
  4.  
  5. inOrder(root); 
  6.  
  7.  
  8. //中序遍歷以Node為根的二分搜索樹,遞歸算法 
  9.  
  10. private void inOrder(Node node){ 
  11.  
  12. if(node ==null
  13.  
  14. return
  15.  
  16. inOrder(node.left); 
  17.  
  18. System.out.println(node.e); 
  19.  
  20. inOrder(node.right); 
  21.  

四、 后序遍歷


  1. //二分搜索樹的后序遍歷 
  2.  
  3. public void postOrder(){ 
  4.  
  5. inOrder(root); 
  6.  
  7.  
  8. public void levelOrder(){ 
  9.  
  10. Queue q = new LinkedList(); 
  11.  
  12. q.add(root); 
  13.  
  14. while (!q.isEmpty()){ 
  15.  
  16. Node cur = q.remove(); 
  17.  
  18. System.out.println(cur.e); 
  19.  
  20. if(cur.left != null
  21.  
  22. q.add(cur.left); 
  23.  
  24. if(cur.right != null
  25.  
  26. q.add(cur.right); 
  27.  
  28.  
  29.  
  30. //后序遍歷以Node為根的二分搜索樹,遞歸算法 
  31.  
  32. private void postOrder(Node node){ 
  33.  
  34. if(node ==null
  35.  
  36. return
  37.  
  38. inOrder(node.left); 
  39.  
  40. inOrder(node.right); 
  41.  
  42. System.out.println(node.e); 
  43.  

五、 理解前中后


二分搜索樹前序非遞歸寫法

 

責任編輯:姜華 來源: 牧小農
相關推薦

2021-02-24 07:46:20

數據結構二叉樹

2021-04-23 09:12:09

Java數據結構算法

2021-04-27 06:21:29

Java數據結構算法

2021-01-07 08:12:47

數據結構二叉樹

2013-01-30 10:34:02

數據結構

2020-11-02 09:15:47

算法與數據結構

2020-06-29 07:44:36

Redis

2016-10-09 08:57:11

python數據結構與算法樹形結構

2017-09-06 10:55:19

Java

2023-09-16 18:35:53

二分查找算法

2022-06-26 00:29:26

分布式系統Redis

2021-04-20 08:37:14

數據結構二叉樹

2021-04-19 07:47:42

數據結構二叉樹Tree

2020-10-30 09:56:59

Trie樹之美

2021-03-18 08:44:20

Java數據結構算法

2022-09-21 07:57:33

二叉搜索樹排序二叉樹

2022-09-26 07:56:53

AVL算法二叉樹

2021-04-28 20:12:27

數據結構創建

2021-03-19 10:25:12

Java數據結構算法

2021-03-29 10:13:47

Java編程數據結構算法
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人综合一区二区 | 亚洲香蕉在线视频 | 国产精品不卡一区 | 日本精品一区二区三区在线观看视频 | 中文成人在线 | 一区欧美| 亚洲视频一区二区三区 | 国产视频二区 | 91成人免费看 | 国产一区二区三区免费 | 国产999精品久久久久久 | 亚洲伊人久久综合 | 亚洲激情一级片 | 亚洲国产一区二区三区在线观看 | 免费国产精品久久久久久 | 久久久一区二区三区四区 | 成人欧美一区二区三区 | 国产精品久久毛片av大全日韩 | 日韩高清中文字幕 | 欧美日韩精品久久久免费观看 | 久久99精品久久久久久国产越南 | 国产在线精品一区二区三区 | 久久69精品久久久久久国产越南 | 亚洲成人黄色 | 欧美精品1区2区3区 免费黄篇 | jav成人av免费播放 | 午夜无码国产理论在线 | 女同久久另类99精品国产 | 夜夜骑首页 | 久久久久国产精品一区 | 国产三区视频在线观看 | a级黄色片在线观看 | 国产美女免费视频 | 久久不射网 | 免费午夜视频在线观看 | 午夜免费在线电影 | 亚洲视频中文字幕 | 国产一区二区在线看 | 精品久久久久久亚洲精品 | 91久久精品一区二区二区 | 日韩欧美一区二区三区 |