树-顺序存储二叉树

博客 分享
0 239
张三
张三 2022-05-31 22:59:56
悬赏:0 积分 收藏

树-顺序存储二叉树

二叉树-删除节点

思考题(课后练习)

  1. 如果要删除的节点是非叶子节点,现在我们不希望将该非叶子节点为根节点的子树删除,需要指定规则, 假如规定如下:
  2. 如果该非叶子节点 A 只有一个子节点 B,则子节点 B 替代节点 A
  3. 如果该非叶子节点 A 有左子节点 B 和右子节点 C,则让左子节点 B 替代节点 A。
  4. 请大家思考,如何完成该删除功能, 老师给出提示.(课后练习)

 

 

 

 

顺序存储二叉树

 

 

顺序存储二叉树的概念

 

 

    • 基本说明

从数据存储来看,数组存储方式和树的存储方式可以相互转换,即数组可以转换成树,树也可以转换成数组, 看右面的示意图。

    • 要求:
  1. 右图的二叉树的结点,要求以数组的方式来存放 arr : [1, 2, 3, 4, 5, 6, 6]
  2. 要求在遍历数组 arr 时,仍然可以以前序遍历,中序遍历和后序遍历的方式完成结点的遍历

 

 

    • 顺序存储二叉树的特点:

 

 

  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.xuge.tree;  2   3 /**  4  * author: yjx  5  * Date :2022/5/3122:31  6  **/  7 public class ArrayBinaryTreeDemo {  8   public static void main(String[] args) {  9     int[] arr = {1, 2, 3, 4, 5, 6, 7}; 10     ArrayBinaryTree tree = new ArrayBinaryTree(arr); 11     tree.preOrder(); 12     tree.infixOrder(0); 13   } 14 } 15  16 //实现顺序存储二叉树遍历 17 class ArrayBinaryTree { 18   private int[] arr;//存储数据节点 19  20   public ArrayBinaryTree(int[] arr) { 21     this.arr = arr; 22   } 23   public void preOrder(){ 24     this.preOrder(0); 25   } 26   //编写一个方法,实现对二叉树前序遍历 27  28   /** 29    * @param index 数组下标 30    */ 31   public void preOrder(int index) { 32     //如果数组为空或者数组为0 33     if (arr.length == 0 || arr == null) { 34       System.out.println("不能遍历.."); 35       return; 36     } 37     //输出当前这个元素 38     System.out.println(arr[index]); 39     //向左递归遍历 40     if ((index * 2 + 1) < arr.length ) { 41       preOrder(2 * index + 1); 42     } 43  44     //向右递归遍历 45     if ((index * 2 + 2) < arr.length ) { 46       preOrder(2 * index + 2); 47     } 48   } 49  50  51  52   //编写一个方法,实现对二叉树中序遍历 53  54   /** 55    * @param index 数组下标 56    */ 57   public void infixOrder(int index) { 58     //如果数组为空或者数组为0 59     if (arr.length == 0 || arr == null) { 60       System.out.println("不能遍历.."); 61       return; 62     } 63     //向左递归遍历 64     if ((index * 2 + 1) < arr.length ) { 65       infixOrder(2 * index + 1); 66     } 67  68     //输出当前这个元素 69     System.out.println(arr[index]); 70  71     //向右递归遍历 72     if ((index * 2 + 2) < arr.length ) { 73       infixOrder(2 * index + 2); 74     } 75   } 76  77  78   //编写一个方法,实现对二叉树中序遍历 79  80   /** 81    * @param index 数组下标 82    */ 83   public void postOrder(int index) { 84     //如果数组为空或者数组为0 85     if (arr.length == 0 || arr == null) { 86       System.out.println("不能遍历.."); 87       return; 88     } 89     //向左递归遍历 90     if ((index * 2 + 1) < arr.length ) { 91       postOrder(2 * index + 1); 92     } 93     //向右递归遍历 94     if ((index * 2 + 2) < arr.length ) { 95       postOrder(2 * index + 2); 96     } 97     //输出当前这个元素 98     System.out.println(arr[index]); 99   }100 }

 

 

posted @ 2022-05-31 22:46 xugeA 阅读(0) 评论(0) 编辑 收藏 举报
回帖
    张三

    张三 (王者 段位)

    821 积分 (2)粉丝 (41)源码

     

    温馨提示

    亦奇源码

    最新会员