1. 程式人生 > >陣列順序儲存二叉樹

陣列順序儲存二叉樹

1.完全二叉樹

    完全二叉樹由於其結構上的特點,通常採用順序儲存方式儲存。一棵有n個結點的完全二叉樹的所有結點從1到n編號,就得到結點的一個線性系列。

    如下圖:完全二叉樹除最下面一層外,各層都被結點充滿了,每一層結點的個數恰好是上一層結點個數的2倍,因此通過一個結點的編號就可以推知它的雙親結點及左,右孩子結點的編號:

當 2i ≤ n 時,結點 i 的左孩子是 2i,否則結點i沒有左孩子;

② 當 2i+1 ≤ n 時,結點i的右孩子是 2i+1,否則結點i沒有右孩子;

③ 當 i ≠ 1 時,結點i的雙親是結點 i/2;

wKioL1VxFQexJ6rQAADyoOXy9yc156.gif

注意:由於陣列下標從0開始,用陣列模擬二叉樹(當然也包括堆)的話,如果根節點的下標為0的話,則對於每個結點i,其左孩子下標為2*i+1;其右孩子下標為2*i+2。

2.一般二叉樹

    對於一般的二叉樹,如果仍按照從上至下,從左到右的順序將樹中的結點順序儲存在一維陣列中,則陣列元素下標之間的關係不能夠反映二叉樹中結點之間的邏輯關係。

    這時假設將一般二叉樹進行改造,增添一些並不存在的空結點,使之成為一棵完全二叉樹的形式,然後再用一維陣列順序儲存。在二叉樹中假設增添的結點在陣列中所對應的元素值為"空"用^表示。

wKiom1VxE9ay_VjbAADLEAsJrFA338.gif

參考博文:

相關推薦

陣列順序儲存

1.完全二叉樹    完全二叉樹由於其結構上的特點,通常採用順序儲存方式儲存。一棵有n個結點的完全二叉樹的所有結點從1到n編號,就得到結點的一個線性系列。    如下圖:完全二叉樹除最下面一層外,各層都

交大OJ 1039 順序儲存

Description用順序儲存實現二叉樹。讀入一棵二叉樹,輸出後序遍歷的結果。Input Format第一行,一個整數 n,表示這棵樹有 n 個節點。這 n 個節點編號為 1 到 n。接下來 n 行,描述每個節點的左右兒子情況。每行包含三個整數 x y z,表示編號為 x

真題2006 完全順序陣列轉化為

題目:一棵具有 n 個結點的完全二叉樹以順序方式儲存在陣列 A 中。設計一個演算法構造該二叉樹的二叉鏈儲存結構。 解:對於以順序方式儲存在陣列 A(其大小為 MaxSize,下標從0開始)中的一棵完全二叉樹,結點 A[i]的左孩子為 A[2i+1],右孩子為 A

陣列儲存森林,實現構建遍歷查插刪

#include <stdio.h> #include <stdlib.h> typedef struct Bnode{ //儲存結點的父結點,子結點數目,自身(同時也是其序號)以及所在樹的根結點 int father,son_n

資料結構與演算法簡記:按層次順序遍歷和儲存

前面曾經記錄過,給出一個按層次順序排放的儲存資料,進而可以構建出一棵二叉樹,今天就來簡單記錄一下,如何按層次順序遍歷二叉樹,最後又如何根據二叉樹生成按層次順序儲存的資料,對於滿二叉樹來講,這十分有必要。 對與這棵二叉樹來說,它的層次遍歷順序和層次儲存順序分

leetcode 508 && 可以將 陣列 轉化為

package com.javamvc.learning.leetcode; import java.util.HashMap; import java.util.Map; public class leetCode508 { static class TreeNode { Tr

劍指offer系列——按之字形順序列印,把列印成多行,序列化二

按之字形順序列印二叉樹 題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 解題思路: 法一: 需要兩個棧。我們在列印某一行節點時,把下一層的子節點儲存到相應的棧裡。 如果

劍指Offer 59. 按之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 題目地址 https://www.nowcoder.com/practice/91b69814117f4e8097390d107d2efbe0?tpId=

資料結構實驗四順序

#include<iostream> #include<string> #define MaxSize 100 using namespace std; class Tree {private: string array[100];

演算法題(三十七):按之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 分析 用兩個棧來實現,先把根結點放入s1,當行數為偶數時,s2從左到右放結點;當行數為奇數時,s1從右到左放結點; 筆者用j

劍指offer 59. 按之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路: 與逐層列印二叉樹一樣,只是多了層數判定,依據層數做判定輸出。 按之字形順序列印二叉樹需要兩個棧。我們在列印某一行

軟考:資料結構基礎——建立順序完全

  首先是關於樹,二叉樹,完全二叉樹的一些知識 一、樹     (一)、基本概念            1. 度:一個節點的子樹的個數    &

(劍指offer)按之字形順序列印

時間限制:1秒 空間限制:32768K 熱度指數:124380 題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路 BFS。每次取出佇列中所有節點,也就是樹的一層 i

按之字形順序列印

題目 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路 思路主要就是如何把層序遍歷序列按層分開來,跟前面的直接列印二叉樹每層思路一樣,只是現在要判斷奇

leetcode 508 && 可以將 陣列 轉化為

package com.javamvc.learning.leetcode; import java.util.HashMap; import java.util.Map; public class leetCode508 { static class Tre

劍指offer32(1,2,3)--從上往下列印,分行從上往下列印,按之字形順序列印

從上往下列印二叉樹 題目描述 從上往下打印出二叉樹的每個節點,同層節點從左至右列印。 思路: 層序遍歷,用到佇列 /* struct TreeNode { int val; struct TreeNode *left; struct TreeNode *right;

劍指offer 59:按之字順序列印

按之字順序列印二叉樹: 先按層次遍歷,儲存到陣列中,列印的時候,遇到偶數行,反轉列印   #include <iostream> #include <algorithm> #include <vector> using namespace

按之字形順序列印 c++實現

題目描述請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。/*struct TreeNode {    int val;    struct TreeNode *left;    s

[劍指offer] 59. 按之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推 思路: 用兩個棧或佇列去儲存,用一個變量表示方向,根據不同方向存取順序不同。 class Solu

[演算法]按之字形順序列印

題目描述 請實現一個函式按照之字形列印二叉樹,即第一行按照從左到右的順序列印,第二層按照從右至左的順序列印,第三行按照從左到右的順序列印,其他行以此類推。 思路 層次遍歷,在此基礎上加上奇數偶數行判斷。 程式碼 import java.util.ArrayList; import java.