Java编程内功-数据结构与算法「顺序二叉树」 - Go语言中文社区

Java编程内功-数据结构与算法「顺序二叉树」


 基本概念

从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树可以转换成数组。如下图所示:


顺序存储二叉树的特点:

  1. 顺序存储通常只考虑完全二叉树;
  2. 第n个元素的左子节点为 2 * n+1;
  3. 第n个元素的右子节点为 2 * n+2;
  4. 第n个元素的父节点为 (n-1)/2;
  5. n 表示二叉树中的第几个元素(按0开始编号如上图所示);

需求

要求给定一个数组{1,2,3,4,5,6,7},要求以二叉树前序遍历的方式进行遍历,前序遍历的结果应当为1,2,4,5,3,6,7,

附加完成中序遍历和后序遍历。

代码案例

  1. package com.xie.tree; 
  2.  
  3. /** 
  4.  * @author: xiexiaofei 
  5.  * @date: 2020-02-09 20:04 
  6.  * @description: 
  7.  */ 
  8. public class ArrBinaryTreeDemo { 
  9.     public static void main(String[] args) { 
  10.         int[] arr = {1, 2, 3, 4, 5, 6, 7}; 
  11.         ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr); 
  12.         System.out.println("顺序存储二叉树的前序遍历数组"); 
  13.         arrBinaryTree.preOrder(0); 
  14.         System.out.println(); 
  15.         System.out.println("顺序存储二叉树的中序遍历数组"); 
  16.         arrBinaryTree.infixOrder(0); 
  17.         System.out.println(); 
  18.         System.out.println("顺序存储二叉树的后序遍历数组"); 
  19.         arrBinaryTree.postOrder(0); 
  20.         System.out.println(); 
  21.  
  22.         /** 
  23.          * 顺序存储二叉树的前序遍历数组 
  24.          * 1 2 4 5 3 6 7 
  25.          * 顺序存储二叉树的中序遍历数组 
  26.          * 2 4 5 1 3 6 7 
  27.          * 顺序存储二叉树的后序遍历数组 
  28.          * 2 4 5 3 6 7 1 
  29.          */ 
  30.  
  31.     } 
  32.  
  33. //实现顺序存储二叉树遍历 
  34. class ArrBinaryTree { 
  35.     private int[] arr;//存储数据节点的数组 
  36.  
  37.     public ArrBinaryTree(int[] arr) { 
  38.         this.arr = arr; 
  39.     } 
  40.  
  41.     /** 
  42.      * 编写一个方法,完成顺序存储二叉树的前序遍历。 
  43.      * 
  44.      * @param index 数组的下标 
  45.      */ 
  46.     public void preOrder(int index) { 
  47.         if (arr == null || arr.length == 0) { 
  48.             System.out.println("数组为空,不能按照二叉树的前序遍历"); 
  49.         } 
  50.         //输出当前的元素 
  51.         System.out.print(arr[index] + " "); 
  52.         //向左递归遍历 
  53.         if ((2 * index + 1) < arr.length) { 
  54.             preOrder(2 * index + 1); 
  55.         } 
  56.         //向右递归 
  57.         if ((2 * index + 2) < arr.length) { 
  58.             preOrder(2 * index + 2); 
  59.         } 
  60.     } 
  61.  
  62.     /** 
  63.      * 编写一个方法,完成顺序存储二叉树的中序遍历。 
  64.      * 
  65.      * @param index 
  66.      */ 
  67.     public void infixOrder(int index) { 
  68.         if (arr == null || arr.length == 0) { 
  69.             System.out.println("数组为空,不能按照二叉树的前序遍历"); 
  70.         } 
  71.  
  72.         //向左递归遍历 
  73.         if ((2 * index + 1) < arr.length) { 
  74.             preOrder(2 * index + 1); 
  75.         } 
  76.  
  77.         //输出当前的元素 
  78.         System.out.print(arr[index] + " "); 
  79.  
  80.         //向右递归 
  81.         if ((2 * index + 2) < arr.length) { 
  82.             preOrder(2 * index + 2); 
  83.         } 
  84.  
  85.     } 
  86.  
  87.     /** 
  88.      * 编写一个方法,完成顺序存储二叉树的后序遍历。 
  89.      * 
  90.      * @param index 
  91.      */ 
  92.     public void postOrder(int index) { 
  93.         if (arr == null || arr.length == 0) { 
  94.             System.out.println("数组为空,不能按照二叉树的前序遍历"); 
  95.         } 
  96.  
  97.         //向左递归遍历 
  98.         if ((2 * index + 1) < arr.length) { 
  99.             preOrder(2 * index + 1); 
  100.         } 
  101.  
  102.         //向右递归 
  103.         if ((2 * index + 2) < arr.length) { 
  104.             preOrder(2 * index + 2); 
  105.         } 
  106.  
  107.         //输出当前的元素 
  108.         System.out.print(arr[index] + " "); 
  109.  
  110.     } 
  111.  

版权声明:本文来源51CTO,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:http://developer.51cto.com/art/202103/650920.htm
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢