樹轉二叉樹(有序樹轉換為二叉樹)講解

2021-09-12 10:28:00 字數 1844 閱讀 6419

description

輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。

input

包含多組測試資料。

每組測試資料第1行為樹的結點個數n(1≤n≤26)。

接下來包含n行,其中第i行(1≤i≤n)的資料依次為結點i的資料值ai(為乙個小寫字母),後面各元素為結點i的兒子序號,以0結束。若ai後僅含乙個0,則表示結點i為葉子節點。

output

輸出包含2行,第一行為先序遍歷序列,第二行為後序遍歷序列。

sample input

18r 2 3 4 0

a 5 6 0

b 7 0

c 8 9 10 0

w 0x 11 12 0

f 0s 13 14 0

t 0u 0

d 15 0

e 0i 16 17 18 0

j 0h 0

m 0o 0

n 0sample output

rawxdhebfcsimonjtu

hedxwfnomjiutscbar

————————————————————————————————————————————

●首先得理解題意啊!!

1.什麼是有序樹

有序樹即:每棵樹的子樹都按照從左到右的順序依次排列,不會出現沒有左側的子樹而有右側子樹的情況。

2.堂兄弟

即同一父親下的所有子樹

3.理解如何將有序樹轉換為二叉樹

解題思路:

●掌握基本的樹轉換為二叉樹的方法。

●找出根節點,構建普通樹。因為該題並沒有告訴根節點所在,所以首要目的是找出根節點,然後再構建普通樹。

●先將堂兄弟聯絡,便於之後轉換為二叉樹(其實rchild就是用來構建堂兄弟關係的鏈式結構,lchild用於儲存孩子)

●各種遍歷輸出。

有人曾問我為什麼會有這樣的轉化思路,其實上面有序樹的定義也就講過了,必定是先有左側的子樹,故這種方法必然保留了左側子樹與父親之間的連線。故對於每乙個結點,最多隻可能連有左側子樹和堂兄弟的兩條邊,如此便滿足了二叉樹定義。

ac**:

#include

using namespace std;

const

int maxn =30;

int n;

//孩子兄弟表示樹

typedef

struct tnodetree;

tree tree[maxn]

;void

preorder

( tree t,

int tmp)

//前序遍歷

void

postorder

( tree t,

int tmp)

//中序遍歷

intmain()

}int tmp =0;

for(

int i =

1; i <= n; i++)}

tree[tmp]

.rchild =0;

//根節點沒有兄弟

preorder

(tree,tmp)

;cout<

postorder

(tree,tmp)

;cout<

}return0;

}

樹轉換為二叉樹

輸入一顆普通有序樹,將它轉換為對應的二叉鍊錶儲存,然後輸出該二叉樹的先序和後序遍歷序列。包含多組測試資料。每組測試資料第1行為樹的結點個數n 1 n 26 接下來包含n行,其中第i行 1 n n 的資料依次為結點i的資料值ai 為乙個小寫字母 後面各元素為結點i的兒子序列,以0結束。若ai後僅含乙個...

樹 二叉樹 滿二叉樹 完全二叉樹 完滿二叉樹

目錄名稱作用根 樹的頂端結點 孩子當遠離根 root 的時候,直接連線到另外乙個結點的結點被稱之為孩子 child 雙親相應地,另外乙個結點稱為孩子 child 的雙親 parent 兄弟具有同乙個雙親 parent 的孩子 child 之間互稱為兄弟 sibling 祖先結點的祖先 ancesto...

二叉樹 二叉樹

題目描述 如上所示,由正整數1,2,3 組成了一顆特殊二叉樹。我們已知這個二叉樹的最後乙個結點是n。現在的問題是,結點m所在的子樹中一共包括多少個結點。比如,n 12,m 3那麼上圖中的結點13,14,15以及後面的結點都是不存在的,結點m所在子樹中包括的結點有3,6,7,12,因此結點m的所在子樹...