樹-順序存儲二叉樹
二叉樹-刪除節點
思考題(課後練習)
- 如果要刪除的節點是非葉子節點,現在我們不希望將該非葉子節點為根節點的子樹刪除,需要指定規則, 假如規定如下:
- 如果該非葉子節點 A 只有一個子節點 B,則子節點 B 替代節點 A
- 如果該非葉子節點 A 有左子節點 B 和右子節點 C,則讓左子節點 B 替代節點 A。
- 請大家思考,如何完成該刪除功能, 老師給出提示.(課後練習)

順序存儲二叉樹
順序存儲二叉樹的概念
- 基本說明
從數據存儲來看,數組存儲方式和樹的存儲方式可以相互轉換,即數組可以轉換成樹,樹也可以轉換成數組, 看右面的示意圖。

- 要求:
- 右圖的二叉樹的結點,要求以數組的方式來存放 arr : [1, 2, 3, 4, 5, 6, 6]
- 要求在遍曆數組 arr 時,仍然可以以前序遍歷,中序遍歷和後序遍歷的方式完成結點的遍歷
- 順序存儲二叉樹的特點:
- 順序二叉樹通常只考慮完全二叉樹
- 第 n 個元素的左子節點為 2 * n + 1
- 第 n 個元素的右子節點為 2 * n + 2
- 第 n 個元素的父節點為 (n-1) / 2
- 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 }


