Java編程內(nèi)功-數(shù)據(jù)結(jié)構(gòu)與算法「順序二叉樹(shù)」
作者:Java精髓
從數(shù)據(jù)存儲(chǔ)來(lái)看,數(shù)組存儲(chǔ)方式和樹(shù)的存儲(chǔ)方式可以相互轉(zhuǎn)換,即數(shù)組可以轉(zhuǎn)換成樹(shù),樹(shù)可以轉(zhuǎn)換成數(shù)組。
基本概念
從數(shù)據(jù)存儲(chǔ)來(lái)看,數(shù)組存儲(chǔ)方式和樹(shù)的存儲(chǔ)方式可以相互轉(zhuǎn)換,即數(shù)組可以轉(zhuǎn)換成樹(shù),樹(shù)可以轉(zhuǎn)換成數(shù)組。如下圖所示:

順序存儲(chǔ)二叉樹(shù)的特點(diǎn):
- 順序存儲(chǔ)通常只考慮完全二叉樹(shù);
- 第n個(gè)元素的左子節(jié)點(diǎn)為 2 * n+1;
- 第n個(gè)元素的右子節(jié)點(diǎn)為 2 * n+2;
- 第n個(gè)元素的父節(jié)點(diǎn)為 (n-1)/2;
- n 表示二叉樹(shù)中的第幾個(gè)元素(按0開(kāi)始編號(hào)如上圖所示);
需求
要求給定一個(gè)數(shù)組{1,2,3,4,5,6,7},要求以二叉樹(shù)前序遍歷的方式進(jìn)行遍歷,前序遍歷的結(jié)果應(yīng)當(dāng)為1,2,4,5,3,6,7,
附加完成中序遍歷和后序遍歷。
代碼案例
- package com.xie.tree;
- /**
- * @author: xiexiaofei
- * @date: 2020-02-09 20:04
- * @description:
- */
- public class ArrBinaryTreeDemo {
- public static void main(String[] args) {
- int[] arr = {1, 2, 3, 4, 5, 6, 7};
- ArrBinaryTree arrBinaryTree = new ArrBinaryTree(arr);
- System.out.println("順序存儲(chǔ)二叉樹(shù)的前序遍歷數(shù)組");
- arrBinaryTree.preOrder(0);
- System.out.println();
- System.out.println("順序存儲(chǔ)二叉樹(shù)的中序遍歷數(shù)組");
- arrBinaryTree.infixOrder(0);
- System.out.println();
- System.out.println("順序存儲(chǔ)二叉樹(shù)的后序遍歷數(shù)組");
- arrBinaryTree.postOrder(0);
- System.out.println();
- /**
- * 順序存儲(chǔ)二叉樹(shù)的前序遍歷數(shù)組
- * 1 2 4 5 3 6 7
- * 順序存儲(chǔ)二叉樹(shù)的中序遍歷數(shù)組
- * 2 4 5 1 3 6 7
- * 順序存儲(chǔ)二叉樹(shù)的后序遍歷數(shù)組
- * 2 4 5 3 6 7 1
- */
- }
- }
- //實(shí)現(xiàn)順序存儲(chǔ)二叉樹(shù)遍歷
- class ArrBinaryTree {
- private int[] arr;//存儲(chǔ)數(shù)據(jù)節(jié)點(diǎn)的數(shù)組
- public ArrBinaryTree(int[] arr) {
- this.arr = arr;
- }
- /**
- * 編寫一個(gè)方法,完成順序存儲(chǔ)二叉樹(shù)的前序遍歷。
- *
- * @param index 數(shù)組的下標(biāo)
- */
- public void preOrder(int index) {
- if (arr == null || arr.length == 0) {
- System.out.println("數(shù)組為空,不能按照二叉樹(shù)的前序遍歷");
- }
- //輸出當(dāng)前的元素
- System.out.print(arr[index] + " ");
- //向左遞歸遍歷
- if ((2 * index + 1) < arr.length) {
- preOrder(2 * index + 1);
- }
- //向右遞歸
- if ((2 * index + 2) < arr.length) {
- preOrder(2 * index + 2);
- }
- }
- /**
- * 編寫一個(gè)方法,完成順序存儲(chǔ)二叉樹(shù)的中序遍歷。
- *
- * @param index
- */
- public void infixOrder(int index) {
- if (arr == null || arr.length == 0) {
- System.out.println("數(shù)組為空,不能按照二叉樹(shù)的前序遍歷");
- }
- //向左遞歸遍歷
- if ((2 * index + 1) < arr.length) {
- preOrder(2 * index + 1);
- }
- //輸出當(dāng)前的元素
- System.out.print(arr[index] + " ");
- //向右遞歸
- if ((2 * index + 2) < arr.length) {
- preOrder(2 * index + 2);
- }
- }
- /**
- * 編寫一個(gè)方法,完成順序存儲(chǔ)二叉樹(shù)的后序遍歷。
- *
- * @param index
- */
- public void postOrder(int index) {
- if (arr == null || arr.length == 0) {
- System.out.println("數(shù)組為空,不能按照二叉樹(shù)的前序遍歷");
- }
- //向左遞歸遍歷
- if ((2 * index + 1) < arr.length) {
- preOrder(2 * index + 1);
- }
- //向右遞歸
- if ((2 * index + 2) < arr.length) {
- preOrder(2 * index + 2);
- }
- //輸出當(dāng)前的元素
- System.out.print(arr[index] + " ");
- }
- }
【編輯推薦】
責(zé)任編輯:姜華
來(lái)源:
今日頭條