树-顺序存储二叉树

二叉树-删除节点

 

思考题(课后练习)

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

 

 

 

 

顺序存储二叉树

 

 

顺序存储二叉树的概念

 

    • 基本说明

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

    • 要求:
  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 @   xugeA  阅读(181)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
点击右上角即可分享
微信分享提示