二叉树-删除节点

思考题(课后练习)

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

树-顺序存储二叉树-LMLPHP

顺序存储二叉树

顺序存储二叉树的概念

    • 基本说明

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

树-顺序存储二叉树-LMLPHP

    • 要求:
  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 }

树-顺序存储二叉树-LMLPHP

05-31 22:52